Comment les émulateurs de terminaux peuvent-ils tuer leurs enfants après avoir reçu un SIGKILL?

12

D'après ce que je comprends, SIGKILL ne peut pas être attrapé. Cela impliquerait qu'un processus n'a pas le temps de tuer ses enfants avant que le système d'exploitation ne le détruise. Cela peut être démontré avec un script shell.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

Le tuer avec SIGKILL laisse mplayer en marche.

$ kill -9 $pid

Mais lorsque vous utilisez un émulateur de terminal (xterm, Terminal, ...), les enfants sont tués avec lui. Comment est-ce possible?

$ mplayer

Et tuez-le:

$ kill -9 $terminal_pid

Et mplayer descend avec le vaisseau. Les émulateurs de terminaux attrapent-ils SIGKILL d'une manière ou d'une autre?

Kevin Cox
la source

Réponses:

11

Le processus démarré par xtermsera le chef de session en charge du terminal.

Lorsque le terminal disparaît, ce processus reçoit automatiquement un signal SIGHUP (suivi d'un SIGCONT). Ceci est envoyé par le noyau de la même manière que les processus reçoivent SIGINT lorsque vous appuyez sur CTRL-C.

De plus, un shell peut envoyer SIGHUP à certains de ses enfants à sa sortie (voir disowndans certains shells pour le désactiver)

Stéphane Chazelas
la source
1
Pour plus d'informations sur les sessions et les animateurs de session: unix.stackexchange.com/questions/18166/… .
Kevin Cox
+1 pour disownlequel est très utile.
math
1

Votre question se répond d'elle-même, cela se produit car ces processus s'exécutent en tant qu'enfants sous l'émulateur de terminal. Vous supprimez donc l'émulateur de terminal et, ce faisant, supprimez tous les processus enfants (car les enfants s'exécutent sous le même groupe de processus que l'émulateur de terminal de contrôle).

Voir, par exemple, ce qui suit:

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 }

Tous ces processus s'exécutent sous les processus `` xfce4-terminal '', donc si je tue ce processus, il tuera automatiquement tous les processus enfants du groupe de processus ... de la même manière, par exemple, que quitter la fenêtre de l'émulateur de terminal serait nécessairement tuer ma connexion SSH.

Des programmes tels que les shells créent de nouveaux groupes de processus, plaçant généralement les processus enfants associés dans un groupe. Chaque travail est un groupe de processus. En dehors du noyau, un shell manipule un travail en envoyant des signaux au groupe de processus du travail avec l'appel système killpg, qui délivre un signal à tous les processus d'un groupe de processus.

Charles Boyd
la source
3
-1: Tuer un parent ne fait pas tuer les enfants.
camh
2
Des programmes tels que les shells créent de nouveaux groupes de processus, plaçant généralement les processus enfants associés dans un groupe. Chaque travail est un groupe de processus. En dehors du noyau, un shell manipule un travail en envoyant des signaux au groupe de processus du travail avec l'appel système killpg, qui délivre un signal à tous les processus d'un groupe de processus.
Charles Boyd
2
@CharlesBoyd Ce commentaire devrait faire partie de votre réponse.
jordanm
4
@CharlesBoyd: Ajoutez cela à votre réponse et je vous donnerai +1 au lieu de -1. Votre réponse se lit actuellement comme si les processus enfants sont tués lorsqu'un processus parent est tué (BTW, sa session, pas son groupe).
camh
@CharlesBoyd Je comprends cela, mais la question est de savoir comment "manipuler [] un travail en envoyant des signaux" lorsqu'il reçoit un SIGKILL. Je ne vois aucun moyen d'utiliser l' killpgappel système à ce stade.
Kevin Cox
0

Premièrement, je ne peux pas reproduire le mplayer survivant au terminal tué, en utilisant xterm.

La raison pour laquelle il meurt, c'est qu'il obtient un SIGHUP de la mort de son parent.

tumbleweed
la source
Je n'ai jamais dit que c'était le cas, j'ai dit qu'il meurt mais survit quand il est dans un script et qu'il est tué.
Kevin Cox
Ne survit pas dans un script, pour moi.
tumbleweed