Respuestas:
La clave es el comando "esperar":
#!/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 wait
usted puede tener la granularidad que necesita:
sleep 1 &
PID1=$!
sleep 2 &
PID2=$!
wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'
Aquí hay una forma de hacerlo:
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
es más adecuado para eso?
Puede ejecutar su proceso con nohup y escribir un script de shell para leer el archivo nohup.out que nohup usa para iniciar sesión.
nohup command &
nohup
no escribe nada nohup.out
; simplemente crea el archivo y redirige la salida del comando hacia él. (2) Si el comando no produce ningún resultado, no se escribirá nada nohup.out
, y esta idea no va a ninguna parte rápidamente. (3) Incluso si command
escribe salida, ¿cómo puede saber cuándo termina monitoreando esa salida?
lsof
para ver si nohup
todavía está usando nohup.out
, pero estoy de acuerdo en que este es un método muy complicado.
command
comienza a correr, nohup
se ha ido. (1) Sí, estoy repitiendo un número, porque estoy repitiendo lo que dije hace dos años: nohup
no escribe nada nohup.out
. (5) Sí, podría escribir un script de shell para ejecutar y ejecutar lsof
para ver sinohup.out
todavía está abierto. Pero esa sería una respuesta diferente. (6) Incluso si hicieras eso, no sería confiable. ¿Qué pasa si algún otro proceso abre el nohup.out
archivo? Realmente querrás comprobar si este proceso específico se había nohup.out
abierto. (7) Pero, si vas a hacer eso, ¿por qué no solo verificas si el proceso se está ejecutando?