Quiero saber si hay una manera de escuchar un proceso en Linux y Unix, cuándo termina y cuál es el código de salida del proceso (script).
No quiero escribir una secuencia de comandos que se ejecute X
segundos y comprobar ps -ef | grep PID
si el proceso aún está vivo. Quiero saber si hay alguna forma en que el proceso me notifique cuándo finalizó y cuál fue su código de salida.
wait
funciona? ¿Cuánta CPU tomará típicamente del sistema?wait
. Sé que no requiere una cantidad notable de recursos del sistema. Puede revisar el código fuente aquí: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.defUno de los enfoques, ciertamente admitidos, es utilizar
strace
:observará el proceso con PID 12345, interceptando ninguna llamada al sistema (primero
-e
) y ninguna señal (segundo-e
). Una vez que el proceso sale de manera regular, se imprimirá el valor de salida.Si el proceso finaliza con una señal, strace sale en silencio (cuando se ejecuta con las opciones dadas anteriormente). Puede usar, por ejemplo,
-e signal=kill
para cambiar este comportamiento. Sin embargo, tenga en cuenta que-e signal=all
(o, de manera equivalente, omitir la-e signal
opción) podría producir una gran cantidad de salida si el programa recibe y maneja las señales.fuente
Encadenamiento de la ejecución de "notificar"
Tenga en cuenta que si el proceso se cierra de forma inesperada
notify
, no se ejecutaráPreparando trampas
El proceso se señala mediante señales de un significado diferente y puede reaccionar adecuadamente
No tiene claro qué notificación tiene en mente. En esencia, puede ser cualquier cosa que suene una "campana", por supuesto. Uno para muchos, por ejemplo.
notify-send
de lalibnotify
bibliotecafuente
Si su proceso se ejecuta como deamon, considere usar advenedizo o monit, son formas estándar:
http://www.alexreisner.com/code/upstart
http://mmonit.com/monit/
Pueden monitorear procesos, salir de código, reiniciar procesos, escribir registros, ...
fuente
Con
ptrace()
puede adjuntar un trazador a un proceso (o ejecutar una nueva), fijar un gancho conPTRACE_O_TRACEEXIT
(Linux> = 5.2.60) y dormir hasta que la salida del proceso, luego conPTRACE_GETEVENTMSG
conseguir el estado de salida.Aquí, una implementación de muestra llamada stopper , la verifiqué solo con la
attach
opción y requirió algunos cambios para que funcionara (eventualmente, si es necesario, publicaré el código en alguna parte).fuente