bash - script - stop background process
¿Cómo ser notificado cuando se completa el trabajo de fondo de un script? (2)
Mi pregunta es muy similar a esta excepto que mi proceso de fondo se inició a partir de un script. Podría estar haciendo algo mal pero cuando intento este simple ejemplo:
#!/bin/bash
set -mb # enable job control and notification
sleep 5 &
Nunca recibo una notificación cuando finaliza el comando de fondo de suspensión. Sin embargo, si ejecuto el mismo directamente en la terminal,
$ set -mb
$ sleep 5 &
$
[1]+ Done sleep 5
Veo el resultado que espero.
Estoy usando bash en cygwin. Supongo que podría tener algo que ver con el destino de la salida, pero al intentar una redirección de salida diferente, no me estoy acercando.
EDITAR: Así que tengo más información sobre el por qué (thx a jkramer), pero aún estoy buscando el cómo. ¿Cómo obtengo la notificación "push" de que un proceso en segundo plano iniciado desde un script ha finalizado? Guardar un PID en un archivo y sondear no es lo que estoy buscando.
El control del trabajo de su shell solo afecta los procesos controlados por su terminal, es decir, las tareas que se inician directamente desde el shell.
Cuando el proceso principal (su secuencia de comandos) muere, el proceso init se convierte automáticamente en el padre del proceso hijo (su comando de suspensión), matando efectivamente a todos los resultados. Prueba este ejemplo:
[jkramer/sgi5k:~]# cat foo.sh
#!/bin/bash
sleep 20 &
echo $!
[jkramer/sgi5k:~]# bash foo.sh
19638
[jkramer/sgi5k:~]# ps -ef | grep 19638
jkramer 19638 1 0 23:08 pts/3 00:00:00 sleep 20
jkramer 19643 19500 0 23:08 pts/3 00:00:00 grep 19638
Como puede ver, el proceso principal de suspensión después de que termina el script es 1, el proceso de inicio. Si necesita que lo notifiquen sobre la finalización del proceso de su hijo, ¡puede guardar el contenido de $! variable (PID del último proceso creado) en un archivo o en algún lugar y use el comando `wait'' para esperar su finalización.
si lo ejecuta como archivo fuente. entonces puede notificar p.ej
cat foo.sh
#!/bin/bash
set -mb # enable job control and notification
sleep 5 &
. foo.sh
[1]+ Done sleep 5