Lanzar un proceso en segundo plano y verificar cuándo termina

¿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

  • Beneficio de esto: NO quema la CPU tiempo con un bucle infinito ejecutándose todo el tiempo ….;)
  • La desventaja de esto es que no puede ' hacer cualquier otra cosa mientras espera , como indicar el progreso al usuario. Solo cuonglm ' s solución le permite hacer esto.
  • @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 $!;

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 en nohup.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 en nohup.out, y esta idea no va a ninguna parte. (3) Incluso si command escribe salida, ¿cómo puede saber cuándo termina supervisando esa salida?
  • @ G- Hombre tal vez comprobando la salida de lsof para ver si nohup todavía está usando nohup.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 en nohup.out. (5) Sí, puede escribir un script de shell para que se repita y ejecutar lsof para ver si nohup.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 archivo nohup.out? Realmente querría comprobar si este proceso específico tenía nohup.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 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *