Avvia un processo in background e controlla quando termina


41

Come posso avviare un processo in background e controllare quando termina con uno script bash? La mia idea è una sceneggiatura come questa:

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

echo "PROCESS TERMINATED"

Risposte:


68

La chiave è il comando "wait":

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"

7
Vantaggio di questo: NON brucia il tempo della CPU con un ciclo infinito in esecuzione tutto il tempo ....;)
Pascal Schmiel

2
Lo svantaggio di ciò è che non puoi fare nient'altro mentre aspetti, come indicare all'utente progressi. Solo la soluzione di cuonglm ti consente di farlo.
Mark Booth,

3
@Mark Booth È possibile indicare l'avanzamento con un terzo lavoro asincrono. ad esempio:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell,

32

Con waitte puoi avere la granularità di cui hai bisogno:

sleep 1 &
PID1=$!
sleep 2 &
PID2=$!

wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'

29

Ecco un modo per farlo:

launch backgroundprocess &
PROC_ID=$!

while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0

2
Grazie, questa è sicuramente l'unica risposta che risponde alla mia interpretazione della domanda originale (e il motivo per cui ho finito per guardare questa domanda)
Mark Booth,

@cuonglm, quali sono i processi multipli? Probabilmente waitè più adatto a questo?
Nishant,

@cuonglm cosa fa l'opzione -0 per uccidere il comando
k_vishwanath il

1
@k_vishwanath segnala se il processo è ancora in esecuzione o meno.
cuonglm

0

È possibile eseguire il processo con nohup e scrivere script di shell per leggere il file nohup.out che nohup utilizza per accedere.

  nohup command &

4
(1) A rischio di scissione dei peli, nohupnon scrive nulla nohup.out; crea semplicemente il file e reindirizza l'output del comando su di esso. (2) Se il comando non produce alcun output, non verrà scritto nulla nohup.oute questa idea non va da nessuna parte. (3) Anche se commandscrive output, come puoi sapere quando termina monitorando quell'output?
G-Man dice "Ripristina Monica" il

@G-Man forse controllando l'output di lsofper vedere se nohupsta ancora usando nohup.out, ma sono d'accordo che questo è un metodo molto peloso.
Alexej Magura,

(4) Quando commandinizia a correre, non nohupc'è più. (1) Sì, sto ripetendo un numero, perché sto ripetendo quello che ho detto due anni fa: nohupnon scrivo nulla a nohup.out. (5) Sì, è possibile scrivere uno script della shell per eseguire il ciclo ed eseguire lsofper vedere se nohup.outè ancora aperto. Ma quella sarebbe una risposta diversa. (6) Anche se lo facessi, sarebbe inaffidabile. E se qualche altro processo aprisse il nohup.outfile? Ti piacerebbe davvero verificare se questo specifico processo fosse nohup.outaperto. (7) Ma, se hai intenzione di farlo, perché non controllare se il processo è in esecuzione?
G-Man dice "Reinstate Monica" il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.