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?
fonte
disown
qual é muito útil.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:
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.
fonte
killpg
chamada do sistema nesse momento.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.
fonte