Christoph: Fehlermeldungen in Datei umleiten (Unix)

Hallo Leute,

diese Frage wurde sicherlich schon oft gestellt, aber ich kann trotzdem keine Antwort finden:

Wie lassen sich unter Unix (genauer AIX 4) Fehlermeldungen in eine Datei umleiten?

Ich habe ein kleines Perlscript, das manchmal sehr lange Fehlermeldungen erzeugt die ich _komplett_ sehen will. Da ich aber ueber Telnet auf einem anderen Rechner arbeite kann ich nicht hochscrollen.

Und wo wir gerade dabei sind: Wenn das Skript ueber einen Webbrowser angesprochen wird: Wie komme ich dann an die Fehlermeldungen?

Es ist leider nicht mein Server und ich habe nur sehr wenig Rechte. Somit kann ich den httpd nicht umkonfigurieren, etc. Es sollte irgendwie in Perl gehen, dass die Fehler in eine (meine!) Logdatei geschrieben werden.

Viele Dank,

Christoph

  1. Hallo,

    Wie lassen sich unter Unix (genauer AIX 4) Fehlermeldungen in eine Datei umleiten?
    Ich habe ein kleines Perlscript, das manchmal sehr lange Fehlermeldungen erzeugt die ich _komplett_ sehen will. Da ich aber ueber Telnet auf einem anderen Rechner arbeite kann ich nicht hochscrollen.
    Und wo wir gerade dabei sind: Wenn das Skript ueber einen Webbrowser angesprochen wird: Wie komme ich dann an die Fehlermeldungen?

    Durch die in Unix allgegenwärtige Ausgabeumleitung.
    #> programm >x.x
    schreibt die Ausgabe von 'programm'  in die Datei 'x.x', wobei die Datei neu angelegt wird.
    #> programm >>x.x
    schreibt die Ausgabe von 'programm'  in die Datei 'x.x', wobei die Datei _nicht_ neu angelegt wird.
    #> programm >x.x 2>y.y
    schreibt die Ausgabe von 'programm'  in die Datei 'x.x', s.o. und 'Fehlermeldungen', sofern das Programm 'ordentlich' programmiert wurde, in 'y.y'.

    Einiges davon funktioniert auch unter DOS, Windows und Konsorten, allerdings nur auf der Shell! nix für Clicki-Bunties ;-)

    Dazu muß Du wissen, daß es sich eingebürgert hat, mit drei Standard-Dateihandles zu arbeiten:
    STDIN  == Eingabe
    STDOUT == normale Ausgabe
    SDTERR == Ausgabe von Fehlern

    In Perl gibts diese Dateihandles auch. Sie heißen auch 'zufällig' gleich.

    In der Core-Dokumentation von Perl wird die Funktion 'open()' beschrieben.
    Dort ist auch erklärt, wie man diese Handles umleitet.
    Lies dort einmal nach.

    Grüße
       Klaus

  2. Hallo,

    Klaus hat ja schon einiges gesagt dazu...

    Ich habe ein kleines Perlscript, das manchmal sehr lange Fehlermeldungen erzeugt die ich _komplett_ sehen will. Da ich aber ueber Telnet auf einem anderen Rechner arbeite kann ich nicht hochscrollen.

    Hierzu noch was von mir: Du kannst den TelnetClient dazu verdonnern ein lokales Logfile zu schreiben, diese Möglichkeit findest Du im Menu, musst mal gucken. Das Logfile kannst Du Dir dann in Ruhe anschauen.

    Urlaubergrüße, Rolf

  3. Sup!

    Wenn Du eine C-Shell oder TC-Shell nutzt, dann ist die Syntax

    programm >& logfile

    oder

    programm >&! logfile

    Das steht auch in der Manpage zur CSH...

    Gruesse,

    Bio

  4. Moin moin!

    Wie lassen sich unter Unix (genauer AIX 4) Fehlermeldungen in eine Datei umleiten?

    Fuer die Kommandozeile wurde Dir das ja bereits erklaert.

    Ich habe ein kleines Perlscript, das manchmal sehr lange Fehlermeldungen erzeugt die ich _komplett_ sehen will. Da ich aber ueber Telnet auf einem anderen Rechner arbeite kann ich nicht hochscrollen.

    Benutzt Du dieses grauenhafte, bei Windows mitgelieferte Telnet? Sogar dort kannst Du ueber Terminal/Einstellungen/Puffergroesse die Zeilenanzahl erhoehen, dann kannst Du auch scrollen. Aber verwende doch einfach ein richtiges Telnet, z.B. QVT Term (http://www.qpc.com/).

    Und wo wir gerade dabei sind: Wenn das Skript ueber einen Webbrowser angesprochen wird: Wie komme ich dann an die Fehlermeldungen?

    Es ist leider nicht mein Server und ich habe nur sehr wenig Rechte. Somit kann ich den httpd nicht umkonfigurieren, etc. Es sollte irgendwie in Perl gehen, dass die Fehler in eine (meine!) Logdatei geschrieben werden.

    Um Warnungen und Fehlermeldungen umzuleiten, gibt es in Perl die Pseudo-Signalhandler __WARN__ und __DIE__. Funktioniert ungefaher so:

    sub logmsg {
        local *LOG;

    open(LOG, ">>private.logfile") or return;     # what could we do if that fails?
        print LOG "$0: ", @_;
        close(LOG);
    }

    zum beginn der ausfuehrung des scripts:

    $SIG{__WARN__} = sub {
        chomp($_[0]);
        logmsg("[warning] ", $_[0]);
    };

    $SIG{__DIE__}  = sub {
        chomp($_[0]);
        logmsg("[error] ", $_[0]);
        # stop further exception processing, especially prevent printing the die() message to STDERR
        exit(0);
    };

    HTH && So long

    1. Das war genau die Antwort die ich wollte! Vielen Dank und Danke auch den anderen, die mir geholfen haben.

      Christoph

  5. Hallo Chtistoph,

    Die Ausgabe/Eingabe eines Prozesses erfolgt unter Unix i.A. auf drei Kanälen: stdin (Kanal 0), stdout (Kanal 1), stderr (Kanal 2). Die Umlenkung erfolgt dann so:
    prog_name < quelle (Eingabekanal)
    prog_name > ziel   (Ausgabekanal)
    prog_name 2> ziel  (Fehlerkanal)

    Das hier im Thread erwähnte & stellt einen Prozess in den Hintergrund. Der Syntax ist prog_name &.

    So läuft es meines Wissen bei Linux und HP-UX. Generell solltest Du aber Informationen zur Shell in den Manpages finden (z.B. man shell)
    Für AIX findet sich die komplette Doku bei www.ibm.com.

    tschö
      
    Wolfgang