Starten Sie einen Hintergrundprozess und prüfen Sie, wann er endet

40

Wie kann ich einen Prozess im Hintergrund starten und prüfen, wann er in einem Bash-Skript endet? Meine Idee ist ein Skript wie dieses:

launch backgroundprocess &
while [ Process is running ];do
   echo "PROCESS IS RUNNING\r"
done;

echo "PROCESS TERMINATED"
0wn3r
quelle

Antworten:

66

Der Schlüssel ist der Befehl "wait":

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"
Pascal Schmiel
quelle
7
Vorteil: Es brennt KEINE CPU-Zeit mit einer Endlosschleife, die die ganze Zeit läuft ....;)
Pascal Schmiel
2
Dies hat den Nachteil, dass Sie während des Wartens nichts anderes tun können, z. B. dem Benutzer den Fortschritt anzeigen. Dies ist nur mit der Lösung von cuonglm möglich .
Mark Booth
3
@Mark Booth Mit einem dritten asynchronen Job können Sie den Fortschritt anzeigen. zB:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell
32

Mit können waitSie 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.'
Mircea Vutcovici
quelle
29

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
cuonglm
quelle
2
Danke, dies ist definitiv die einzige Antwort, die meine Interpretation der ursprünglichen Frage beantwortet (und der Grund, warum ich diese Frage
Mark Booth
@ Cuonglm, Was gibt es mehrere Prozesse? Ist das wahrscheinlich waitbesser geeignet?
Nishant
@ Cuonglm, was -0 Option tut, um Befehl zu töten
k_vishwanath
1
@k_vishwanath gibt an, ob der Prozess noch läuft oder nicht.
Donnerstag,
0

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 &
Abhishek Anand Amralkar
quelle
4
(1) nohupSchreiben 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) commandWie können Sie feststellen, wann eine Schreibausgabe endet, indem Sie diese Ausgabe überwachen?
G-Man sagt, dass Monica
@ G-Man vielleicht durch Überprüfen der Ausgabe von, lsofum festzustellen, ob nohupnoch verwendet wird nohup.out, aber ich bin damit einverstanden, dass dies eine sehr haarige Methode ist.
Alexej Magura
(4) Bis die Zeit zu commandlaufen beginnt, nohupist es vorbei. (1) Ja, ich wiederhole eine Nummer, weil ich wiederhole, was ich vor zwei Jahren gesagt habe: nohupSchreibe nichts an nohup.out. (5) Ja, Sie können ein Shell-Skript schreiben, um eine Schleife zu erstellen und lsofzu prüfen, ob nohup.outes 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.outDatei geöffnet hat ? Sie möchten wirklich überprüfen, ob dieser bestimmte Prozess nohup.outoffen war. (7) Aber wenn Sie das tun wollen, warum nicht einfach prüfen, ob der Prozess läuft?
G-Man sagt, dass Monica