Rolf: Systembefehle und Fehlerbehandlung

Hallo,

wie kann ich verhinderen, dass sich ein über CGI aufgerufener und fehlgeschlagener Systembefehl im ERROR_LOG verewigt?

Viele Grüße, Rolf

Beispiel

if( system("ping -c 4 $ping_string > $ping_file") ){
print "<h4>Unbekannter Host oder Fehler im Ping-Befehl</h4>";
unlink $ping_file;
exit(0);
}

Obwohl hier ein exit(0) steht, erfolgt ein Eintrag in die LOG-Datei
  1. Hallo Rolf!

    wie kann ich verhinderen, dass sich ein über CGI aufgerufener und fehlgeschlagener Systembefehl im ERROR_LOG verewigt?

    AFAIK erscheinen im Errorlog die Ausgaben auf STDERR (ausser auf Dummbrot IIS natuerlich, aber der interessiert uns hier sicher nicht). Musst also einfach den Kanal auch umleiten, z.B.
    system("ping -c 4 $ping_string > $ping_file 2> &1")
    oder wenn Du die Fehlermeldungen ganz skippen willst
    system("ping -c 4 $ping_string > $ping_file 2> /dev/null")

    So lange

  2. Hallo,
    wie kann ich verhindern, dass sich ein über CGI aufgerufener und fehlgeschlagener Systembefehl im ERROR_LOG verewigt?

    Obwohl hier ein exit(0) steht, erfolgt ein Eintrag in die LOG-Datei

    Was genau steht denn im ErrorLog?

    if( system("ping -c 4 $ping_string > $ping_file") ){

    »»  print "<h4>Unbekannter Host oder Fehler im Ping-Befehl</h4>";
    »»  unlink $ping_file;
    »»  exit(0);

    }

    Hm. system() halte ich für keine elegante Lösung in Deinem Fall, und die Umleitung der Ausgabe in eine Datei für noch schlechter. (Was ist, wenn Dein Skript zweimal parallel gestartet wird?)

    Wenn es Dir darum geht, die Ausgabe eines Kommandos aufzufangen, gibt es dafür die backticks (also $msg = ping -c 4 $ping\_string, siehe Kapitel "I/O-Operatoren").
    Falls Du auch noch den Returncode des Kommandos brauchst: "The status value of the command is returned in $?", siehe Kapitel "Variablen".

    1. Hallo,

      Was genau steht denn im ErrorLog?

      ping: unknown host: werner.de

      Hm. system() halte ich für keine elegante Lösung in Deinem Fall, und die Umleitung der Ausgabe in eine Datei für noch schlechter. (Was ist, wenn Dein Skript zweimal parallel gestartet wird?)

      $temp_file = "/dir_x/$$.tmp";

      Wenn es Dir darum geht, die Ausgabe eines Kommandos aufzufangen, gibt es dafür die backticks (also $msg = ping -c 4 $ping\_string, siehe Kapitel "I/O-Operatoren").
      Falls Du auch noch den Returncode des Kommandos brauchst: "The status value of the command is returned in $?", siehe Kapitel "Variablen".

      Das guck ich mir auf jeden Fall mal an; Rolf

  3. HJi,

    wie kann ich verhinderen, dass sich ein über CGI aufgerufener und fehlgeschlagener Systembefehl im ERROR_LOG verewigt?

    wie waere es mit dieser Zeile gleich am Anfang des Codes:

    open(STDERR,">>meine_error.log");

    und bei system()-calls so:

    system("$PROGRAMMNAME 2>&1 >> meine_error.log");

    Ciao,
      Wolfgang

    1. reHi,

      dazu was witziges: Es gibt wirklich ein ganzes _Modul_ dafuer, was
      oben die eine Zeile macht....
      (Ok, das Modul ist laenger, aber wenn ihr das ganze Geklapper darin weglaesst...)

      Ciao,
      Wolfgang

      1. reHi,

        dazu was witziges: Es gibt wirklich ein ganzes _Modul_ dafuer, was
        oben die eine Zeile macht....
        (Ok, das Modul ist laenger, aber wenn ihr das ganze Geklapper darin weglaesst...)

        Ciao,

        »»  Wolfgang

        Stimmt Wolfgang, das Net::Ping Modul ist wirklich ein Witz ;-)# Rolf

  4. Hallo, vielen Dank an Euch Alle!; Rolf

    Hier noch ein paar Gedanken... das Temp-File heißt "/dir_x/$$.tmp" und somit hat jeder Prozess sein Eigenes... Aber den ganzen Kram mit einem Modul zu machen ist ne gute Idee; Rolf