Risposte:
La chiave è il comando "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 $!;
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.'
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
waitè più adatto a questo?
È possibile eseguire il processo con nohup e scrivere script di shell per leggere il file nohup.out che nohup utilizza per accedere.
nohup command &
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?
lsofper vedere se nohupsta ancora usando nohup.out, ma sono d'accordo che questo è un metodo molto peloso.
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?