Un enfoque, ciertamente de mano dura, es usar strace
:
$ strace -e trace=none -e signal=none -p 12345
observará el proceso con PID 12345, sin interceptar ninguna llamada al sistema (primero -e
) y sin señales (segundo -e
). Una vez que el proceso sale de manera regular, se imprimirá el valor de salida.
Si el proceso termina con una señal, strace sale silenciosamente (cuando se ejecuta con las opciones dadas arriba). Puede utilizar, p. -e signal=kill
para cambiar este comportamiento. Tenga en cuenta, sin embargo, que -e signal=all
(o, de manera equivalente, omitiendo el -e signal
opción) podría producir una gran cantidad de salida si el programa recibe y maneja las señales.
-
Encadenamiento de la ejecución de "notify"
$ process; notify $? &
Tenga en cuenta que si el proceso se cierra de forma inesperada
notify
no se ejecutará -
Colocando trampas
El proceso está señalado por señales de un significado diferente y puede reaccionar apropiadamente
#!/bin/bash process function finish { notify $? } trap finish EXIT
No tienes claro qué notificación tienes en mente. En esencia, puede ser cualquier cosa que te suene, por supuesto. Uno para muchos, por ejemplo. notify-send
de libnotify
biblioteca.
$ process; notify-send "process finished with status $?" &
Bash hace esto por ti. Le notificará cuando finalice el proceso devolviéndole el control y almacenará el estado de salida en la variable especial $?
. Se ve más o menos así:
someprocess
echo $?
Consulte el manual de bash sobre parámetros especiales para obtener más información.
Pero supongo que quieres hacer otro trabajo mientras esperas. En bash puedes hacer eso así:
someprocess &
otherwork
wait %+
echo $?
someprocess &
iniciará el proceso en segundo plano. Eso significa que el control regresará de inmediato y podrá hacer otro trabajo. Un proceso iniciado en segundo plano se denomina trabajo en bash. wait
esperará a que finalice el trabajo dado y luego devolverá el estado de salida de ese trabajo. Los trabajos son referenciados por %n
. %+
se refiere al último trabajo iniciado. Consulte el manual de bash sobre el control de trabajos para obtener más información.
Si realmente necesita el PID, también puede hacerlo así:
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
es una variable especial que contiene el PID del último proceso en segundo plano iniciado.