Wie kann ich Perl-warten Sie, bis die untergeordneten Prozesse im hintergrund gestartet und mit system()?
Ich habe einige Perl-code, der ausgeführt wird, ein shell-Skript für mehrere Parameter, um zu vereinfachen, werde ich einfach davon ausgehen, dass ich code, der wie folgt aussieht:
for $p (@a){
system("/path/to/file.sh $p&");
}
Ich würde gerne ein paar mehr Sachen nach, aber ich kann nicht einen Weg finden, zu warten, bis alle Kind-Prozesse zu beenden, bevor Sie fortfahren.
Konvertieren Sie den code zu verwenden, fork() zu schwierig sein. Gibt es nicht einen einfacheren Weg?
Sie benötigen den tatsächlichen return-code aus file.sh? Sie können das Skript ändern, so dass es in eine Datei schreibt, wenn Sie abgeschlossen?
Warum sollte konvertieren Sie den code zu Gabel schwierig sein? Blenden Sie alle details in einem Unterprogramm. Man könnte sogar neu definieren system() aufrufen, um Ihre neue Routine statt.
Wahrscheinlich werde ich nur split diesen Teil in eine separate Skript wird der Gabelung, und rufen Sie die von der system call...
Warum sollte konvertieren Sie den code zu Gabel schwierig sein? Blenden Sie alle details in einem Unterprogramm. Man könnte sogar neu definieren system() aufrufen, um Ihre neue Routine statt.
Wahrscheinlich werde ich nur split diesen Teil in eine separate Skript wird der Gabelung, und rufen Sie die von der system call...
InformationsquelleAutor Osama Al-Maadeed | 2009-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit fork/exec/wait ist nicht so schlimm:
Behoben. Danke, ich bin nicht wirklich eine Muttersprache Perl.
$pid == -1 sollte wohl das sein !defined($pid) statt.
InformationsquelleAutor Dave
Sind Sie gehen zu müssen, um etwas zu ändern, ändern Sie den code, Gabel ist wahrscheinlich einfacher, aber wenn Sie tot sind, legen Sie gegen die Verwendung von Gabel, könnte man eine wrapper-shell-Skript, das eine Datei anspricht, wenn es fertig ist und dann haben Sie Ihre Perl-code prüfen der Existenz der benötigten Dateien.
Hier ist der wrapper:
Ihrem Perl-code würde wie folgt Aussehen:
Aber ich denke, das forking-code ist sicherer und klarer:
Offenbar tun dies erzeugt eine Menge von zombie-Prozessen. en.wikipedia.org/wiki/Zombie_process
Es sollte nicht sein. Ein zombie entsteht, wenn der übergeordnete Prozess nicht call wait oder waitpid. Wie Sie sehen können die Eltern anruft waitpid für ein Kind, das beendet wurde. Sie sind immer ein Haufen zombies dann hat man entweder etwas falsch machen oder eines der ersten Kinder, ist die Einnahme eine lange Zeit, und die späteren Kinder beendet haben (aber nicht genutzt). Sie wechseln konnte, um
while (waitpid(-1, WNOHANG) > 0) { sleep 1 }
zu ernten, das nächste Kind verlassen."eines der ersten Kinder, ist die Einnahme eine lange Zeit, und die späteren Kinder beendet haben (aber nicht genutzt)." Ja, das ist genau, was geschah in meinem Fall. Offensichtlich war dies ein sehr sehr spezieller Fall mit einer Menge von Prozessen. Ich denke, schrieb ich den letzten Kommentar in einem ziemlich schlechten Stil. Ich wollte nur, um sicherzustellen, dass die Menschen einen Rahmen für zombie-Prozesse wenn Sie dies tun.
InformationsquelleAutor Chas. Owens
Umwandlung von fork() kann schwierig sein, aber es ist das richtige Werkzeug. system() ist ein blockierender Aufruf; Sie sind immer die nicht-blockierende Verhalten durch ausführen einer shell und sagen Sie zu laufen Skripte im hintergrund. Das bedeutet, dass Perl keine Ahnung hat, was die PIDs der Kinder sein könnte, was bedeutet, dass Ihr Skript nicht wissen, was zu warten.
Könnten Sie versuchen, zu kommunizieren, die PIDs, die bis zu dem Perl-script, aber das bekommt schnell aus der hand. Die Verwendung von fork().
InformationsquelleAutor darch