¿Hay alguna forma de escuchar el proceso?

9

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 Xsegundos y comprobar ps -ef | grep PIDsi 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.

Nir
fuente

Respuestas:

3

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 volverá de inmediato y puede hacer otro trabajo. Un proceso iniciado en segundo plano se llama trabajo en bash. waitesperará a que termine 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 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.

lesmana
fuente
¿Y cómo waitfunciona? ¿Cuánta CPU tomará típicamente del sistema?
Nir
1
No sé cómo funciona exactamente bash 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.def
lesmana
6

Uno de los enfoques, ciertamente admitidos, es utilizar strace:

$ strace -e trace=none -e signal=none -p 12345

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=killpara cambiar este comportamiento. Sin embargo, tenga en cuenta que -e signal=all(o, de manera equivalente, omitir la -e signalopción) podría producir una gran cantidad de salida si el programa recibe y maneja las señales.

Ansgar Esztermann
fuente
4
  1. Encadenamiento de la ejecución de "notificar"

    $ process; notify $? &

    Tenga en cuenta que si el proceso se cierra de forma inesperada notify, no se ejecutará

  2. Preparando trampas

    El proceso se señala mediante señales de un significado diferente y puede reaccionar adecuadamente

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT

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-sendde la libnotifybiblioteca

$ process; notify-send "process finished with status $?" &
Miroslav Koškár
fuente
1

Con ptrace()puede adjuntar un trazador a un proceso (o ejecutar una nueva), fijar un gancho con PTRACE_O_TRACEEXIT(Linux> = 5.2.60) y dormir hasta que la salida del proceso, luego con PTRACE_GETEVENTMSGconseguir el estado de salida.

Aquí, una implementación de muestra llamada stopper , la verifiqué solo con la attachopción y requirió algunos cambios para que funcionara (eventualmente, si es necesario, publicaré el código en alguna parte).

Alex
fuente