Antworten:
Der Schlüssel ist der Befehl "wait":
#!/bin/bash
/my/process &
/another/process &
wait
echo "All processes done!"
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
Mit können wait
Sie die Granularität haben, die Sie benötigen:
sleep 1 &
PID1=$!
sleep 2 &
PID2=$!
wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'
Hier ist eine Möglichkeit, dies zu tun:
launch backgroundprocess &
PROC_ID=$!
while kill -0 "$PROC_ID" >/dev/null 2>&1; do
echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0
wait
besser geeignet?
Sie können Ihren Prozess mit nohup ausführen und ein Shell-Skript schreiben, um die Datei nohup.out zu lesen, die von nohup zum Protokollieren verwendet wird.
nohup command &
nohup
Schreiben Sie auf die Gefahr des Haarspaltens nichts an nohup.out
; es lediglich erstellt die Datei und leitet die Ausgabe des Befehls zu. (2) Wenn der Befehl keine Ausgabe erzeugt, wird nichts geschrieben nohup.out
, und diese Idee geht nirgendwo so schnell. (3) command
Wie können Sie feststellen, wann eine Schreibausgabe endet, indem Sie diese Ausgabe überwachen?
lsof
um festzustellen, ob nohup
noch verwendet wird nohup.out
, aber ich bin damit einverstanden, dass dies eine sehr haarige Methode ist.
command
laufen beginnt, nohup
ist es vorbei. (1) Ja, ich wiederhole eine Nummer, weil ich wiederhole, was ich vor zwei Jahren gesagt habe: nohup
Schreibe nichts an nohup.out
. (5) Ja, Sie können ein Shell-Skript schreiben, um eine Schleife zu erstellen und lsof
zu prüfen, ob nohup.out
es noch offen ist. Aber das wäre eine andere Antwort. (6) Selbst wenn Sie das tun würden, wäre es unzuverlässig. Was ist, wenn ein anderer Prozess die nohup.out
Datei geöffnet hat ? Sie möchten wirklich überprüfen, ob dieser bestimmte Prozess nohup.out
offen war. (7) Aber wenn Sie das tun wollen, warum nicht einfach prüfen, ob der Prozess läuft?