Wie kann ich die initialisieren Perl STDIN/STDOUT/STDERR?
Habe ich ein Perl-Skript, welches die Gabeln und die daemonizes selbst. Es ist von cron ausgeführt, um die nicht verlassen ein zombie herum, ich schließe STDIN,STDOUT und STDERR:
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
if (!fork()) {
do_some_fork_stuff();
}
Die Frage die ich habe ist: die würde ich gerne wiederherstellen, zumindest STDOUT nach diesem Punkt (es wäre schön, wiederherstellen den anderen 2). Aber was magischen Symbolen muss ich verwenden, um re-öffnen Sie STDOUT als das, was STDOUT verwendet werden?
Ich weiß, dass ich könnte "/dev/tty" wenn ich von einem tty (aber ich bin läuft von cron und je nach stdout an anderer Stelle). Ich habe auch gelesen, tricks, wo Sie STDOUT beiseite mit open SAVEOUT,">&STDOUT"
sondern nur der Akt der Herstellung dieses Kopie löst nicht das ursprüngliche problem, dass eine zombie herum.
Ich bin auf der Suche, um zu sehen, ob es etwas Magie wie open STDOUT,"|-"
(die ich kenne ist es nicht) zu öffnen, STDOUT, wie Sie sollte geöffnet werden.
InformationsquelleAutor der Frage Josh | 2009-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es immer noch nützlich, zwei Dinge in den Sinn kommen:
Können Sie in der Nähe von STDOUT/STDERR/STDIN in genau der Kind-Prozess (d.h. falls (!fork()). Dies ermöglicht es den Eltern, um Sie immer noch verwenden, weil Sie immer noch öffnen Sie es.
Ich denke, Sie können verwenden die einfachere close(STDOUT), anstatt es zu öffnen /dev/null.
Beispiel:
InformationsquelleAutor der Antwort Michael Krebs
# kopieren der Datei-Deskriptoren
# redirect stderr in der warning Datei
# schließen Sie die Weiterleitung filehandles
# wiederherstellen von stdout und stderr
#Ich hoffe, das funktioniert für Sie.
#-Hariprasad AJ
InformationsquelleAutor der Antwort Hari
Einmal geschlossen, gibt es keine Möglichkeit, es wieder zu bekommen.
Warum tun Sie müssen STDOUT wieder? Zum schreiben von Nachrichten auf der Konsole? Verwenden Sie /dev/console, oder schreiben Sie an syslog mit Sys::Syslog.
Aber ganz ehrlich, die andere Antwort richtig ist. Speichern Sie die alte stdout (geklont, um eine neue fd) wenn Sie möchten, öffnen Sie es erneut später. Es tut lösen sich die "zombie" - problem, da kann man dann umleiten fd 0 (und 1 & 2) nach /dev/null.
InformationsquelleAutor der Antwort jmanning2k