O comando kill
, quando recebe um PID que é < -1, trata-o como um ID de grupo de processos (PGID), não como um ID de processo. Isso está documentado em info kill
:
‘PID < -1’
The process group whose identifier is −PID.
Se pegarmos seu exemplo novamente:
$ pstree -p 19935
php(19935)───sh(19936)───spawn(19937)─┬─sleep(19938)
└─sleep(19939)
O PGID é o PID do processo pai mais alto da árvore de processos, neste caso 19935
. No entanto, você tentou eliminar os processos pertencentes ao grupo de processos com ID 19937
e 19936
, sendo que nenhum deles é realmente IDs de grupos de processos. O PGID é 19935
.
Você talvez possa ver isso mais claramente com ps
. Se eu executar os mesmos comandos no meu sistema:
$ php -f ./zombie.php &
[2] 12882
$ ps -o pid,ppid,pgid,command | grep -E '[P]GID|[1]2882'
PID PPID PGID COMMAND
12882 1133 12882 php -f ./zombie.php
12883 12882 12882 /bin/bash ./spawn
12884 12883 12882 sleep 1d
12885 12883 12882 sleep 1d
No exemplo acima, o PGID do grupo é 12882
, e é isso que preciso usar se quiser matar tudo no grupo.
Quando você executa o comando diretamente do shell, o processo pai mais importante é o PID do script de shell, portanto, você pode eliminar todos os processos em sua árvore executando kill -- -PID
:
$ ./spawn &
[3] 14213
terdon@tpad foo $ ps -o pid,ppid,pgid,command | grep -E '[P]GID|[1]4213'
PID PPID PGID COMMAND
14213 1133 14213 /bin/bash ./spawn
14214 14213 14213 sleep 1d
14215 14213 14213 sleep 1d
Mas isso acontece porque o PID do script de shell é o PGID do grupo.