0 votos

¿Cómo averiguar qué o quién mató exactamente un proceso de python?

Ejecuté un fragmento de código de Python de esta manera python -m example.main en la terminal.

Se ejecutó durante unos 10 minutos y luego vi zsh: mató python -m example.main

Ya revisé el registro del kernel de esta manera: dmesg | grep 1101 donde 1101 era el PID del proceso de Python. Y no mostró nada. Por lo tanto, creo que no está relacionado con OOM.

Creo que "zsh: killed..." significa que el proceso fue matado por algo con la señal SIGKILL. Desafortunadamente, no hay forma de atrapar la señal SIGKILL dentro del programa de Python para saber quién emite la señal.

¿Hay alguna forma de decir exactamente quién/qué proceso emite la señal SIGKILL a mi programa de Python? ¿Cómo puedo monitorear esto?

0voto

rybosome Puntos 1829

Puedes usar una herramienta de trazado del sistema, como dtrace, para observar la invocación de la llamada al sistema kill en el kernel, que es la forma en que se envían las señales POSIX. Estás principalmente interesado en SIGKILL, que es la señal número 9.

Aquí tienes un script de dtrace que monitorizará todas las señales enviadas desde cualquier proceso a cualquier otro proceso en tu sistema. Para utilizarlo:

  1. Guarda este script como un archivo con extensión .d.
  2. Dale al script permisos de ejecución (chmod u+x NOMBREDELSCRIPT.d).
  3. Ejecuta el script como superusuario (sudo ./NOMBREDELSCRIPT.d).
  4. Inicia tu programa de Python.
  5. Encuentra el PID de tu programa de Python (por ejemplo, a través de ps o top) y toma nota de él.
  6. Cuando veas que tu programa de Python ha sido matado, encuentra su PID en el registro de señales, confirmando que ves la señal número 9, y encontrarás el nombre y PID del proceso que la envió.

    !/usr/sbin/dtrace -qs

    syscall::kill:entry { self->target = arg0; self->signal = arg1; }

    syscall::kill:return /self->signal != 0 && self->target > 0/ { printf("%s (%d) --> % 6d: señal %d\n", execname, pid, self->target, self->signal);

    self->target = 0;
    self->signal = 0;

    }

    dtrace:::BEGIN { printf("ORIGEN (PID) --> DESTINO: SEÑAL\n"); printf("================================\n"); }

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X