pkill não matando processos passados descendentes imediatos de um processo

1

Eu quero matar uma cadeia de processo, por exemplo

PID  PPID
100  XXX
101  100
102  101

Quando eu uso pkill -P 100 PID 100 e 101 morrem como esperado, mas 102 recebe init como PPID.

Como posso forçar o pkill a continuar eliminando os processos encadeados dos descendentes imediatos de um processo?

    
por noobcoder 23.06.2016 / 01:41

1 resposta

2

pkill está fazendo exatamente o que você mandou: matou os processos cujo pai é 100. Não processa o pai de um pai / mãe com 100.

Nem o pkill do Linux nem o do FreeBSD tem uma opção para percorrer a árvore de processos. Você pode chamar pstree -l e analisar sua saída.

Tenha em mente que se A forks B, B forks C e B morrer, não haverá mais relação pai-filho que possa conectar A e C.

Pode haver uma maneira de eliminar todos esses processos, mas tenha cuidado com isso.

Se você passar um ID de processo negativo para kill , isso elimina todo o grupo de processos . Isso é atômico, então funciona mesmo se um dos processos forquear, assim como você está executando kill . Isso só mata os processos que não se colocaram em seu próprio grupo e também mata o processo pai e outros se eles estiverem no mesmo grupo de processos. Execute ps -o pgid … para ver o ID do grupo de processos.

Se todos os processos que você quer matar tiverem um arquivo em particular aberto, você pode usar fuser -k /some/file para matar todos os processos que possuem este arquivo aberto.

Outra opção no Linux é executar os processos em suas próprio namespace PID . Você pode então matar todo o espaço de nomes matando o pseudo-PGID -1 de dentro do namespace.

    
por 23.06.2016 / 01:53