Por lo que entiendo, SIGKILL no puede ser atrapado. Esto implicaría que un proceso no tiene tiempo para matar a sus hijos antes de que el sistema operativo lo destruya. Esto se puede demostrar con un script de shell.
#! /bin/bash
trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.
mplayer video.avi
Matarlo con SIGKILL deja a mplayer en funcionamiento.
$ kill -9 $pid
Pero cuando se usa un emulador de terminal (xterm, Terminal, ...), los niños mueren junto con él. ¿Cómo es esto posible?
$ mplayer
Y mátalo:
$ kill -9 $terminal_pid
Y mplayer cae con la nave. ¿Los emuladores de terminales están atrapando de alguna manera a SIGKILL o hay otra fuerza en acción aquí?
fuente
disown
cual es muy útil.Su pregunta se responde a sí misma, esto sucede porque estos procesos se ejecutan como hijos en el emulador de terminal. Por lo tanto, elimina el emulador de terminal y, al hacerlo, elimina todos los procesos secundarios (dado que los elementos secundarios se ejecutan bajo el mismo grupo de procesos que el emulador de terminal de control).
Ver, por ejemplo, lo siguiente:
Todos estos procesos se ejecutan bajo los procesos 'xfce4-terminal', por lo que si elimino ese proceso, eliminará automáticamente todos los procesos secundarios en el grupo de procesos ... de la misma manera, por ejemplo, al salir de la ventana del emulador de terminal necesariamente mata mi conexión SSH.
Los programas como los shells crean nuevos grupos de procesos, generalmente ubicando procesos secundarios relacionados en un grupo. Cada trabajo es un grupo de procesos. Fuera del núcleo, un shell manipula un trabajo enviando señales al grupo de procesos del trabajo con la llamada al sistema killpg, que entrega una señal a todos los procesos en un grupo de procesos.
fuente
killpg
llamada al sistema en ese punto.En primer lugar, no puedo reproducir el mplayer que sobrevive al terminal que está siendo asesinado, usando
xterm
.La razón por la que muere es porque recibe un VISTAZO de la muerte de sus padres.
fuente