Ein – zugegebenermaßen schwerfälliger – Ansatz ist die Verwendung von strace
:
$ strace -e trace=none -e signal=none -p 12345
überwacht den Prozess mit PID 12345 und fängt keinen Systemaufruf ab (zuerst -e
) und keine Signale (zweite -e
). Sobald der Prozess regulär beendet wird, wird der Exit-Wert gedruckt.
Wenn der Prozess durch ein Signal beendet wird, wird strace stillschweigend beendet (wenn es mit den oben angegebenen Optionen ausgeführt wird). Sie können z. -e signal=kill
dieses Verhalten zu ändern. Beachten Sie jedoch, dass -e signal=all
(oder entsprechend das Weglassen des -e signal
Option) kann eine große Ausgabemenge erzeugen, wenn Signale empfangen und vom Programm verarbeitet werden.
-
Verkettung der Ausführung von "notify"
$ process; notify $? &
Beachten Sie, dass, wenn der Prozess auf unerwartete Weise beendet wird
notify
wird nicht ausgeführt -
Fallen aufstellen
Prozess wird durch Signale unterschiedlicher Bedeutung signalisiert und kann entsprechend reagieren
#!/bin/bash process function finish { notify $? } trap finish EXIT
Sie sind sich nicht sicher, welche Benachrichtigung Sie meinen. Im Wesentlichen kann es natürlich alles sein, was eine "Glocke" läutet. Einer für viele zB. notify-send
ab libnotify
Bibliothek.
$ process; notify-send "process finished with status $?" &
Bash erledigt dies für Sie. Es wird Sie benachrichtigen, wenn der Prozess endet, indem es Ihnen die Kontrolle zurückgibt, und es speichert den Ausgangsstatus in der speziellen Variable $?
. Es sieht ungefähr so aus:
someprocess
echo $?
Weitere Informationen finden Sie im Bash-Handbuch zu speziellen Parametern.
Aber ich nehme an, 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 erledigen können. Ein im Hintergrund gestarteter Prozess wird in der Bash als Job bezeichnet. wait
wartet, bis der angegebene Job beendet ist, und gibt dann den Beendigungsstatus dieses Jobs zurück. Jobs werden durch %n
referenziert . %+
bezieht sich auf den zuletzt gestarteten Job. Weitere Informationen finden Sie im Bash-Handbuch zur Jobsteuerung.
Wenn Sie die PID wirklich brauchen, können Sie es auch so machen:
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
ist eine spezielle Variable, die die PID des zuletzt gestarteten Hintergrundprozesses enthält.