Como matar cascata no Linux? [duplicado]

0

Digamos que eu tenha o processo A, que gera o processo B, que gera o processo C. Em que circunstâncias a matança A matará toda a cadeia (ou árvore, eu acho) e quando isso não ocorrerá? Às vezes acho que sim, e às vezes o B termina com o ppid 1 e o C fica intocado.

Esse comportamento varia entre versões específicas do kernel do Linux?

    
por Gaius 07.11.2014 / 22:59

1 resposta

5

A chamada do sistema kill() e o comando kill shell podem ser usados para eliminar processos ou grupos de processos. De qualquer forma, não há "cascata", nunca.

  • Quando o comando kill() system call ou kill shell recebe um número inteiro positivo, isso representa um processo. O sinal é enviado para esse processo e não para outros.

  • Quando a chamada de sistema kill() recebe um inteiro negativo ou o comando kill shell recebe um identificador de trabalho que começa com % (como %1 ou %2 ), o sinal é enviado simultaneamente a todos os membros de um grupo de processos . Grupos de processos são um recurso de controle de tarefas. No uso de shell interativo, cada pipeline de shell (como sed s/foo/bar/ | cat -n | gzip ) é composto de 1 ou mais processos que fazem parte do mesmo grupo de processos.

(Para a chamada do sistema, há alguns casos extras: -1 envia para cada processo, 0 envia para você).

Nada disso significa que, quando um processo morre, outro processo também não morre por algum outro motivo. Por exemplo:

  • Um processo que gera um filho pode interceptar um sinal de término e passá-lo para a criança que criou antes de sair, como forma de limpar o próprio.
  • Quando um processo anterior em um pipeline de shell, como o acima, morre (por qualquer motivo), os processos posteriores no pipeline de shell geralmente terminam prontamente, porque eles não estão mais recebendo nenhuma entrada.

O kernel não é responsável por tais conseqüências "adicionais" e elas dependem de como o software envolvido se comporta.

    
por 07.11.2014 / 23:13

Tags