¿Cómo puedo lanzar un proceso en segundo plano y verificar cuándo termina dentro de un script bash? Mi idea es una secuencia de comandos como esta:
launch backgroundprocess & while [ Process is running ];do echo "PROCESS IS RUNNING\r" done; echo "PROCESS TERMINATED"
Respuesta
La clave es el comando «esperar»:
#!/bin/bash /my/process & /another/process & wait echo "All processes done!"
Comentarios
Responda
Con wait
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."
Respuesta
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
Comentarios
- 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)
- @cuonglm, ¿Qué hay múltiples procesos? ¿Probablemente
wait
es más adecuado para eso? - @cuonglm ¿Qué hace la opción -0 para matar el comando
- @k_vishwanath informa si el proceso todavía se está ejecutando o no.
Respuesta
Puede ejecutar su proceso con nohup y escribir un script de shell para leer nohup.out archivo que nohup utiliza para registrar.
nohup command &
Comentarios
- (1) En el riesgo de partirse los pelos,
nohup
no ' t escribe nada ennohup.out
; simplemente crea el archivo y redirige la salida del comando a él. (2) Si el comando no ' t produce ningún resultado, no se escribirá nada ennohup.out
, y esta idea no va a ninguna parte. (3) Incluso sicommand
escribe salida, ¿cómo puede saber cuándo termina supervisando esa salida? - @ G- Hombre tal vez comprobando la salida de
lsof
para ver sinohup
todavía está usandonohup.out
, pero estoy de acuerdo en que este es un método muy complicado. - (4) Para cuando
command
comience a funcionar,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 ennohup.out
. (5) Sí, puede escribir un script de shell para que se repita y ejecutarlsof
para ver sinohup.out
todavía está abierto. Pero esa sería una respuesta diferente. (6) Incluso si hiciera eso, no sería confiable. ¿Qué pasa si algún otro proceso abre el archivonohup.out
? Realmente querría comprobar si este proceso específico teníanohup.out
abierto. (7) Pero, si va a hacer eso, ¿por qué no simplemente verifica si el proceso se está ejecutando?
Respuesta
wait
solo funciona para un proceso hijo iniciado en el mismo shell; después de todo, es una función de shell.
Para cualquier proceso en segundo plano arbitrario, debe trabajar con PID. Lo que nadie menciona aquí es el reciclaje de PID del núcleo. Los sistemas Linux modernos pueden reutilizar PID bastante a menudo dependiendo de la carga. Necesita más que solo PID para identificar de manera confiable el proceso. Un enfoque simple es ahorrar tiempo cuándo comenzó el proceso y compárelo regularmente con la hora de inicio del proceso actual. Si se recicla el PID, su hora de inicio no será la misma.
La hora de inicio del proceso se informa como el campo 22 en / proc / [pid] / stat archivo. El tiempo se mide en jiffies (como máximo 10 ms), lo que proporciona suficiente precisión para detectar el reciclaje de ID de proceso.
PID=<process ID> START_TIME=$(cut -d " " -f 22 /proc/$PID/stat) while [ "$(cut -d " " -f 22 /proc/$PID/stat 2>/dev/null)" = "$START_TIME" ]; do echo "PROCESS IS RUNNING" sleep 1 done
cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;