GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo esperar la salida de procesos no secundarios

En BSD y OS X, puede usar kqueue con EVFILT_PROC+NOTE_EXIT para hacer exactamente eso. No se requiere sondeo. Desafortunadamente, no existe un equivalente de Linux.


También puede crear un socket o un FIFO y leer en ellos. El FIFO es especialmente simple:conecte la salida estándar de su hijo con el FIFO y lea. La lectura se bloqueará hasta que el niño salga (por cualquier motivo) o hasta que emita algunos datos. Por lo tanto, necesitará un pequeño bucle para descartar los datos de texto no deseados.

Si tiene acceso a la fuente del niño, abra el FIFO para escribir cuando comience y luego simplemente olvídese. El sistema operativo limpiará el descriptor de archivo abierto cuando el niño termine y su proceso "principal" en espera se activará.

Ahora bien, este podría ser un proceso que usted no inició o no posee. En ese caso, puede reemplazar el ejecutable binario con un script que inicie el binario real pero que también agregue monitoreo como se explicó anteriormente.


Hasta ahora he encontrado tres formas de hacer esto en Linux:

  • Polling:compruebas la existencia del proceso cada cierto tiempo, ya sea usando kill o probando la existencia de /proc/$pid , como en la mayoría de las otras respuestas
  • Utilice el ptrace llamada al sistema para adjuntar al proceso como un depurador para que reciba una notificación cuando salga, como en la respuesta de a3nm
  • Utilice el netlink interfaz para escuchar PROC_EVENT_EXIT mensajes:de esta manera, el kernel le informa a su programa cada vez que un proceso finaliza y usted solo espera la ID de proceso correcta. Solo he visto esto descrito en un lugar en Internet.

Complemento desvergonzado:estoy trabajando en un programa (de código abierto, por supuesto; GPLv2) que hace cualquiera de los tres.


Nada equivalente a wait() . La práctica habitual es sondear usando kill(pid, 0) y buscando el valor de retorno -1 y errno de ESRCH para indicar que el proceso se ha ido.

Actualización: Desde el kernel de Linux 5.3, existe una llamada al sistema pidfd_open, que crea un fd para un pid dado, que se puede sondear para recibir una notificación cuando el pid haya salido.


Linux
  1. ¿Qué son los procesos zombis y cómo encontrar y eliminar procesos zombis?

  2. 30 ejercicios de procesos de Linux para administradores de sistemas

  3. ¿Cómo buscar códigos de salida para aplicaciones?

  4. Linux:¿cómo dejar de compartir la red para el proceso actual?

  5. Cómo configurar la ID del proceso en Linux para un programa específico

Cómo usar el comando htop para monitorear los procesos del sistema en tiempo real

Cómo matar procesos Zombie en Linux

Comandos para la Gestión de Procesos en Linux

Cómo enviar procesos a segundo plano en Linux

Cómo matar procesos Zombie en Ubuntu

Cómo matar procesos en Linux usando kill, killall y pkill