Inicie un proceso en segundo plano y verifique cuándo termina

41

¿Cómo puedo iniciar un proceso en segundo plano y verificar cuándo termina dentro de un script bash? Mi idea es un guión como este:

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

echo "PROCESS TERMINATED"
0wn3r
fuente

Respuestas:

68

La clave es el comando "esperar":

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"
Pascal Schmiel
fuente
77
Beneficio de esto: NO quema el tiempo de CPU con un bucle infinito corriendo todo el tiempo ...;)
Pascal Schmiel
2
La desventaja de esto es que no puede hacer nada más mientras espera, como indicar el progreso al usuario. Solo la solución de cuonglm le permite hacer esto.
Mark Booth
3
@Mark Booth Puede indicar el progreso con un tercer trabajo asincrónico. por ejemplo:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell
32

Con waitusted 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.'
Mircea Vutcovici
fuente
29

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
Cuonglm
fuente
2
Gracias, esta es definitivamente la única respuesta que responde a mi interpretación de la pregunta original (y la razón por la que terminé mirando esta pregunta)
Mark Booth
@cuonglm, ¿qué hay múltiples procesos? ¿Probablemente waites más adecuado para eso?
Nishant
@cuonglm qué hace la opción -0 para matar comando
k_vishwanath
1
@k_vishwanath informa si el proceso aún se está ejecutando o no.
Cuonglm
0

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 &
Abhishek Anand Amralkar
fuente
44
(1) A riesgo de partir los pelos, nohupno 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 commandescribe salida, ¿cómo puede saber cuándo termina monitoreando esa salida?
G-Man dice 'Restablecer a Monica' el
@ G-Man tal vez verificando la salida de lsofpara ver si nohuptodavía está usando nohup.out, pero estoy de acuerdo en que este es un método muy complicado.
Alexej Magura
(4) Para cuando commandcomienza a correr, nohupse ha ido. (1) Sí, estoy repitiendo un número, porque estoy repitiendo lo que dije hace dos años: nohupno escribe nada nohup.out. (5) Sí, podría escribir un script de shell para ejecutar y ejecutar lsofpara 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.outarchivo? Realmente querrás comprobar si este proceso específico se había nohup.outabierto. (7) Pero, si vas a hacer eso, ¿por qué no solo verificas si el proceso se está ejecutando?
G-Man dice 'reinstalar a Monica' el