Tengo un programa que genera y se comunica con la CPU procesos pesados e inestables, no creados por mí. Si mi aplicación se bloquea o se destruye por SIGKILL
, también quiero que se eliminen los subprocesos, por lo que el usuario no tiene que rastrearlos y matarlos manualmente.Asesinando a los niños con el padre
Sé que este tema ya se trató anteriormente, pero probé todos los métodos descritos, y ninguno de ellos parece estar a la altura para sobrevivir a la prueba.
Sé que debe ser posible, ya que los terminales lo hacen todo el tiempo. Si ejecuto algo en una terminal y mato a la terminal, las cosas siempre mueren.
He intentado atexit
, doble tenedor y ptys
. atexit
no funciona para sigkill
; la doble horquilla no funciona en absoluto; y ptys
No he encontrado forma de trabajar con Python.
Hoy en día, descubrí prctl(PR_SET_PDEATHSIG, SIGKILL)
, que debería ser una forma de que los procesos secundarios ordenen una muerte en sí mismos, cuando su padre muere. traté de usarlo con popen
, pero las costuras no tener ningún efecto en absoluto:
import ctypes, subprocess
libc = ctypes.CDLL('/lib/libc.so.6')
PR_SET_PDEATHSIG = 1; TERM = 15
implant_bomb = lambda: libc.prctl(PR_SET_PDEATHSIG, TERM)
subprocess.Popen(['gnuchess'], preexec_fn=implant_bomb)
En lo anterior, se crea el niño y las salidas de los padres. Ahora esperaría que gnuchess
recibiera un SIGKILL
y muera, pero no es así. Todavía puedo encontrarlo en mi administrador de procesos usando 100% de CPU.
¿Alguien puede decirme si hay algún problema con mi uso de prctl
?, o ¿sabe cómo las terminales logran matar a sus hijos?
Me parece muy preocupante título :( – Dal
Offtopic: Nice xD título –
Debería estar en moms4moms.com StackExchange sitio ... – Antony