stopped stop script run job bash scripting background jobs notify

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