Bash macht das für dich. Es benachrichtigt Sie, wenn der Prozess endet, indem es Ihnen die Kontrolle zurückgibt, und speichert den Exit-Status in der speziellen Variablen $?
. Es sieht ungefähr so aus:
someprocess
echo $?
Weitere Informationen finden Sie im Bash-Handbuch zu speziellen Parametern .
Aber ich gehe davon aus, dass Sie während des Wartens andere Arbeiten erledigen möchten. In Bash können Sie das so machen:
someprocess &
otherwork
wait %+
echo $?
someprocess &
startet den Vorgang im Hintergrund. Das bedeutet, dass die Kontrolle sofort zurückkehrt und Sie andere Arbeiten ausführen können. Ein im Hintergrund gestarteter Prozess wird als Job in Bash bezeichnet. wait
wartet, bis der angegebene Job beendet ist, und gibt dann den Beendigungsstatus dieses Jobs zurück. Jobs werden von referenziert %n
. %+
bezieht sich auf den zuletzt gestarteten Job. Weitere Informationen finden Sie im Bash-Handbuch zur Jobsteuerung .
Wenn Sie die PID wirklich benötigen, können Sie dies auch folgendermaßen tun:
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
ist eine spezielle Variable, die die PID des zuletzt gestarteten Hintergrundprozesses enthält.
wait
das? Wie viel CPU wird normalerweise vom System benötigt?wait
funktioniert. Ich weiß, dass es keine nennenswerte Menge an Systemressourcen erfordert. Sie können den Quellcode hier überprüfenEin - zugegebenermaßen hartnäckiger - Ansatz besteht darin, Folgendes zu verwenden
strace
:überwacht den Prozess mit der PID 12345 und fängt keinen Systemaufruf (erster
-e
) und keine Signale (zweiter-e
) ab. Sobald der Prozess regelmäßig beendet wird, wird der Exit-Wert gedruckt.Wenn der Prozess durch ein Signal beendet wird, wird strace lautlos beendet (wenn es mit den oben angegebenen Optionen ausgeführt wird). Sie können zB verwenden
-e signal=kill
, um dieses Verhalten zu ändern. Beachten Sie jedoch, dass-e signal=all
(oder gleichwertig das Weglassen der-e signal
Option) eine große Menge an Ausgabe erzeugen kann, wenn Signale vom Programm empfangen und verarbeitet werden.quelle
Verkettung der Ausführung von "benachrichtigen"
Beachten Sie, dass wenn der Prozess auf unerwartete Weise beendet
notify
wird, er nicht ausgeführt wirdFallen aufstellen
Der Prozess wird durch Signale unterschiedlicher Bedeutung signalisiert und kann entsprechend reagieren
Sie sind sich nicht sicher, welche Benachrichtigung Sie im Sinn haben. Im Wesentlichen kann es natürlich alles sein, was eine "Glocke" läutet. Eins für viele zB.
notify-send
aus derlibnotify
Bibliothek.quelle
Wenn Ihr Prozess als Deamon ausgeführt wird, sollten Sie Upstart oder Monit verwenden. Dies sind Standardmethoden:
http://www.alexreisner.com/code/upstart
http://mmonit.com/monit/
Sie können Prozesse überwachen, Code beenden, Prozesse neu starten, Protokolle schreiben, ...
quelle
Mit können
ptrace()
Sie einen Tracer an einen Prozess anhängen (oder einen neuen ausführen), einen Hook mitPTRACE_O_TRACEEXIT
(linux> = 2.5.60) setzen und bis zum Beenden des Prozesses schlafen und dannPTRACE_GETEVENTMSG
den Exit-Status abrufen .Hier eine Beispielimplementierung namens Stopper , ich habe sie nur mit der
attach
Option überprüft und es waren einige Änderungen erforderlich, damit sie funktioniert (eventuell werde ich den Code bei Bedarf irgendwo veröffentlichen).quelle