Como os Emuladores de Terminal Podem Matar Seus Filhos Depois de Receber um SIGKILL?

12

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

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

Matar com SIGKILL deixa o mplayer rodando.

$ kill -9 $pid

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

$ mplayer

E mate:

$ kill -9 $terminal_pid

E o mplayer desce com o navio. Emuladores de terminal estão pegando SIGKILL ou há outra força em ação aqui?

    
por Kevin Cox 06.11.2012 / 06:17

3 respostas

11

O processo iniciado por xterm será 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). Isto é enviado pelo kernel de uma forma similar que os processos recebem SIGINT quando você pressiona CTRL-C.

Além disso, um shell pode enviar SIGHUP para alguns de seus filhos ao sair (consulte disown em alguns shells para desativá-lo)

    
por 06.11.2012 / 14:19
1

Sua pergunta é respondida, isso acontece porque esses processos estão sendo executados como filhos no emulador de terminal. Então, você mata o emulador de terminal e, ao fazer isso, mata todos os processos filhos (já que os filhos estão executando sob o 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 sendo executados sob os processos 'xfce4-terminal', portanto, se eu eliminar esse processo, ele matará automaticamente todos os processos filhos no grupo de processos ... da mesma maneira, por exemplo, que sai do terminal a janela do emulador necessariamente mataria 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 job com a chamada do sistema killpg, que fornece um sinal para todos os processos em um grupo de processos.

    
por 06.11.2012 / 07:23
0

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

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

    
por 06.11.2012 / 13:39