¿Cómo pueden los emuladores de terminal matar a sus hijos después de recibir un SIGKILL?

12

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í?

Kevin Cox
fuente

Respuestas:

11

El proceso iniciado por xtermserá el líder de la sesión en control de la terminal.

Cuando el terminal desaparece, ese proceso recibe automáticamente una señal SIGHUP (seguida de un SIGCONT). El núcleo lo envía de manera similar a la que los procesos reciben SIGINT cuando presiona CTRL-C.

Además, un shell puede enviar SIGHUP a algunos de sus hijos al salir (vea disownen algunos shells para deshabilitar eso)

Stéphane Chazelas
fuente
1
Para información sobre sesiones y líderes de sesión: unix.stackexchange.com/questions/18166/… .
Kevin Cox
+1 para lo disowncual es muy útil.
Matemáticas el
1

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:

csb@darwin[~]$ ps fauwx | grep -A6 "xfce4-terminal" | awk '{ for (i = 2; i <= 9; i++) $i="" ; print $0 }' 
csb         0:32 xfce4-terminal --geometry=271x65 --display :0.0 --role=Terminal-0x1340050-2606-1351620352 --show-menubar --show-borders --hide-toolbars --working-directory /home/csb --tab --working-directory /home/csb
csb         0:00 \_ gnome-pty-helper
csb         0:00 \_ bash
csb         0:00 | 
                  \_ ssh [redacted]
csb         0:00 \_ bash
csb         0:00 \_ ps fauwx
csb         0:00 \_ grep --color=auto -A6 xfce4-terminal
csb         0:00 \_ awk { for (i = 2; i <= 9; i++) $i="" ; print $0 }

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.

Charles Boyd
fuente
3
-1: Matar a un padre no la causa de los niños a ser asesinados.
camh
2
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.
Charles Boyd el
2
@CharlesBoyd Ese comentario debería ser parte de tu respuesta.
jordanm
44
@CharlesBoyd: Agregue eso a su respuesta y le daré +1 en lugar de -1. Su respuesta actualmente se lee como si los procesos secundarios se mataran cuando se mata un proceso padre (por cierto, está basado en la sesión, no en el grupo).
camh
@CharlesBoyd Entiendo eso, pero el punto de la pregunta es cómo "manipula [] un trabajo enviando señales" cuando recibe un SIGKILL. No veo forma de que use la killpgllamada al sistema en ese punto.
Kevin Cox
0

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.

planta rodadora
fuente
Nunca dije que sí, dije que muere pero sobrevive cuando está en un guión y eso es asesinado.
Kevin Cox
No sobrevive en un guión, para mí.
planta rodadora