Como os emuladores de terminal podem matar seus filhos após receberem um SIGKILL?

12

Pelo que entendi, SIGKILL não pode ser pego. Isso implica que um processo não tem tempo para matar seus filhos antes que o sistema operacional o destrua. Isso pode ser demonstrado com um script de shell.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

Matá-lo com SIGKILL deixa o mplayer em execução.

$ kill -9 $pid

Mas ao usar um emulador de terminal (xterm, Terminal, ...), as crianças são mortas junto com ele. Como isso é possível?

$ mplayer

E mate-o:

$ kill -9 $terminal_pid

E mplayer afunda com o navio. Os emuladores de terminal estão de alguma forma capturando a SIGKILL ou há outra força em ação aqui?

Kevin Cox
fonte

Respostas:

11

O processo iniciado xtermserá o líder da sessão no controle do terminal.

Quando o terminal desaparece, esse processo recebe automaticamente um sinal SIGHUP (seguido por um SIGCONT). Isso é enviado pelo kernel de maneira semelhante aos processos que recebem SIGINT quando você pressiona CTRL-C.

Além disso, um shell pode enviar SIGHUP para alguns de seus filhos ao sair (veja disownem alguns shells para desativar isso)

Stéphane Chazelas
fonte
1
Para obter informações sobre sessões e líderes de sessão: unix.stackexchange.com/questions/18166/… .
Kevin Cox
+1 para o disownqual é muito útil.
math
1

Sua pergunta responde a si mesma, isso acontece porque esses processos estão sendo executados como filhos no emulador de terminal. Portanto, você mata o emulador de terminal e, ao fazê-lo, mata todos os processos filhos (já que os filhos estão executando no mesmo grupo de processos que o emulador de terminal de controle).

Veja, por exemplo, o seguinte:

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 esses processos estão em execução nos processos 'xfce4-terminal', então, se eu matar esse processo, ele matará automaticamente todos os processos filhos no grupo de processos ... da mesma maneira, por exemplo, que sair da janela do emulador de terminal necessariamente matar minha conexão SSH.

Programas como shells criam novos grupos de processos, geralmente colocando processos filhos relacionados em um grupo. Cada trabalho é um grupo de processos. Fora do kernel, um shell manipula um trabalho enviando sinais para o grupo de processos do trabalho com a chamada do sistema killpg, que envia um sinal para todos os processos em um grupo de processos.

Charles Boyd
fonte
3
-1: Matar um dos pais não causa a morte dos filhos.
Camh
2
Programas como shells criam novos grupos de processos, geralmente colocando processos filhos relacionados em um grupo. Cada trabalho é um grupo de processos. Fora do kernel, um shell manipula um trabalho enviando sinais para o grupo de processos do trabalho com a chamada do sistema killpg, que envia um sinal para todos os processos em um grupo de processos.
22630 Charles Boyd
2
@CharlesBoyd Esse comentário deve fazer parte da sua resposta.
Jordanm #
4
@CharlesBoyd: adicione isso à sua resposta e eu darei um +1 em vez de -1. Sua resposta atualmente parece que processos filho são mortos quando um processo pai é morto (BTW, seu com base na sessão, não com base no grupo de processos).
Camh
@CharlesBoyd Eu entendo isso, mas o ponto da questão é como "manipula [] um trabalho enviando sinais" quando recebe um SIGKILL. Não vejo como usar a killpgchamada do sistema nesse momento.
Kevin Cox
0

Primeiramente, não consigo reproduzir o mplayer que sobreviveu ao terminal sendo morto usando xterm.

A razão pela qual ele morre, é que ele recebe um SIGHUP da morte de seus pais.

tumbleweed
fonte
Eu nunca disse que sim, disse que morre, mas sobrevive quando está em um script e é morto.
Kevin Cox
Não sobrevive em um roteiro, para mim.
amaranto