Erhalte den Exit-Code eines Hintergrundprozesses
Ich habe einen Befehl CMD genannt von meinem Haupt-bourne-shell-Skript, das dauert ewig.
Möchte ich ändern Sie das Skript wie folgt:
- Führen Sie den Befehl CMD in parallel-als hintergrund-Prozess ($CMD &).
- Im Haupt-Skript eine Schleife zur überwachung der erzeugte Befehl alle paar Sekunden. Die Schleife auch gibt einige Meldungen auf stdout ausgegeben, der angibt, den Fortschritt des Skripts.
- Beenden die Schleife, wenn der erzeugte Befehl beendet.
- Erfassen und berichten von der exit-code des gestarteten Prozesses.
Kann mir jemand Zeiger um dies zu erreichen?
InformationsquelleAutor der Frage bob | 2009-10-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
1: In der bash,
$!
hält die PID des letzten hintergrund-Prozess ausgeführt wurde. Das wird Ihnen sagen, welche Prozesse zu überwachen, sowieso.4:
wait <n>
wartet, bis der Prozess mit der ID abgeschlossen ist (es wird blockiert, bis der Prozess abgeschlossen ist, so dass Sie vielleicht nicht wollen, rufen Sie diese, bis Sie sicher sind, dass der Prozess abgeschlossen ist). Nachwait
gibt, ist der exit-code des Prozesses wird wieder in die variable$?
2, 3:
ps
oderps | grep " $! "
kann Ihnen sagen, ob der Prozess noch läuft. Es ist bis zu Ihnen, wie zu verstehen, die Ausgabe und entscheiden, wie nahe es ist, zu schlichten. (ps | grep
ist nicht idiotensicher. Wenn Sie Zeit haben, können Sie kommen mit einer robusten Weise zu sagen, ob der Prozess noch läuft).Hier ist ein skeleton-script:
InformationsquelleAutor der Antwort mob
Dies ist, wie ich es gelöst hatte, wenn ich ein ähnliches Bedürfnis:
InformationsquelleAutor der Antwort Bjorn
Wie ich das sehe, fast alle Antworten, die Verwendung externer Dienstprogramme (meist
ps
) zu poll den Stand der Prozess im hintergrund. Es ist ein mehr unixesh Lösung, fangen die SIGCHLD-signal. In der signal-handler muss überprüft werden, welcher child-Prozess beendet wurde. Es kann getan werden, indemkill -0 <PID>
eingebaut (universal) oder die überprüfung der Existenz von/proc/<PID>
- Verzeichnis (Linux-spezifisch) oder mit derjobs
eingebaut (bash spezifische.jobs -l
berichtet auch die pid. In diesem Fall ist das 3. Feld der Ausgang Gestoppt werden kann|Running|Done|Beenden . ).Hier ist mein Beispiel.
Startete der Prozess heißt
loop.sh
. Es akzeptiert-x
oder eine Zahl als argument. Für-x
ist beendet mit exit-code 1. Für eine Nummer es wartet num*5 Sekunden. In alle 5 Sekunden druckt er seine PID.Der launcher-Prozess aufgerufen wird
launch.sh
:Weitere Erklärung siehe: Starten Sie einen Prozess von der bash-Skript fehlgeschlagen
InformationsquelleAutor der Antwort TrueY
InformationsquelleAutor der Antwort Abu Aqil
Ich würde ändern Sie Ihr Ansatz etwas. Eher als die überprüfung alle paar Sekunden, wenn der Befehl noch aktiv ist, und die Berichterstattung eine Nachricht, haben, einem anderen Prozess, dass die Berichte alle paar Sekunden, die der Befehl wird noch ausgeführt und dann töten Sie diesen Prozess, wenn der Befehl abgeschlossen ist. Zum Beispiel:
InformationsquelleAutor der Antwort William Pursell
Einem einfachen Beispiel, ähnlich zu den oben genannten Lösungen. Dies erfordert nicht die überwachung von Prozess-Ausgang. Das nächste Beispiel verwendet den Schwanz, um zu Folgen-Ausgang.
Verwenden Schwanz zu Folgen, Prozess, output und beenden, wenn der Prozess abgeschlossen ist.
InformationsquelleAutor der Antwort Darren Weber
Unser team hatte das gleiche muss mit einem remote-SSH-Skript ausgeführt, das timing war nach 25 Minuten Inaktivität. Hier ist eine Lösung mit der monitoring-Schleife die überprüfung der Prozess im hintergrund jede Sekunde, aber drucken nur alle 10 Minuten zu unterdrücken, um eine Inaktivitäts-timeout.
InformationsquelleAutor der Antwort DKroot
Die pid eine hintergrund-Kind-Prozess wird gespeichert in $!.
Sie können Shop alle Kind-Prozesse' pids in ein array, z.B. PIDS[].
Warten, bis der Kind-Prozess von jedem Prozess-ID pid oder job-Spezifikation jobspec beendet und die Rückkehr der exit-status des letzten Befehls gewartet. Wenn ein job spec angegeben ist, werden alle Prozesse in der Arbeit gewartet. Wenn keine Argumente angegeben sind, werden alle derzeit aktiven Kind-Prozesse gewartet, und der status ist null. Wenn die option-n angegeben wird, warten, wartet, für jeden job zu kündigen, und gibt den exit-status. Wenn weder jobspec noch pid gibt eine aktive child-Prozess der shell, die Rückkehr status 127.
Verwenden warten Befehl können Sie warten, bis alle Kind-Prozesse beenden, in der Zwischenzeit können Sie bekommen, exit-status eines jeden Kindes Prozesse über $? und store status in STATUS[]. Dann können Sie etwas tun, je nach status.
Habe ich versucht, die folgenden 2 Lösungen, und Sie laufen gut. solution01 ist
präziser, während solution02 ist ein wenig kompliziert.
solution01
solution02
InformationsquelleAutor der Antwort Terry wang
Andere Lösung ist es, Prozesse überwachen, über das proc-Dateisystem (sicherer als ps/grep-combo); wenn Sie einen Prozess starten, hat es einen entsprechenden Ordner in /proc/$pid, also die Lösung könnte sein,
Jetzt können Sie die $exit_status variable, wie du willst.
InformationsquelleAutor der Antwort Искрен Хаджинедев
Kann dies sein, der sich über Ihre Frage, aber wenn Sie sind besorgt über die Länge der Zeit, die Prozesse ausgeführt werden, können Sie Interesse an der überprüfung des status des im hintergrund Laufenden Prozesse nach einem Intervall der Zeit. Es ist leicht genug, um zu überprüfen, welche untergeordneten PIDs laufen noch mit
pgrep -P $$
jedoch kam ich mit der folgenden Lösung zum überprüfen der exit-status dieser PIDs, die bereits abgelaufen sind:welche Ausgänge:
Beachten Sie: Sie könnte sich ändern
$pids
um eine string-variable anstatt array, um die Dinge zu vereinfachen, wenn Sie mögen.InformationsquelleAutor der Antwort errant.info
Mit dieser Methode, wird Ihr script nicht warten, bis der Prozess im hintergrund, Sie wird nur zu überwachen, eine temporäre Datei, die den exit-status.
nun, Ihr Skript etwas anderes tun können, während Sie einfach nur zu halten, die überwachung der Inhalte von retFile (es können auch andere Informationen, die Sie wollen, wie die exit time).
PS.: btw, ich kodierte denken in der bash
InformationsquelleAutor der Antwort Aquarius Power