Como diz, ele envia o sinal para todos os membros do grupo de processos do chamador.
Os grupos de processos são usados para implementar o controle de tarefas no shell (eles podem ser usados para outras coisas, mas o controle de tarefas do shell interativo é o principal motivo de sua existência).
Você notará que quando você digita Ctrl-C , todos os processos dos trabalhos atuais são eliminados, não apenas o que os iniciou. Além disso, isso não mata os trabalhos em segundo plano.
Isso é conseguido com grupos de processos. Um job é um grupo de processos iniciados por um shell que o shell pode colocar em segundo plano ou em primeiro plano (definido como o grupo de processos em primeiro plano do terminal ou não) e matar como um todo.
Você pode descobrir sobre IDs de grupos de processos e ids de sessão com ps -j
( j
para o controle J ob).
Para eliminar o grupo de processos do PGID $x
, você faz:
kill -- "-$x"
kill 0
mata o grupo de processos do chamador.
Observe que, se você fizer isso: /bin/kill 0
, o shell iniciará um novo trabalho para executar o comando kill
, portanto, kill
só se matará.
kill
normalmente é um shell embutido, então kill
irá matar o grupo de processos do shell.
No entanto, quando o shell é interativo, é o processo que gerencia os grupos de processos, portanto, normalmente não há outro processo no grupo de processos do shell. Todos os processos iniciados pelo shell estão em outros grupos de processos:
$ sleep 1000 &
[1] 22746
$ ps -j
PID PGID SID TTY TIME CMD
22735 22735 22735 pts/23 00:00:00 zsh
22746 22746 22735 pts/23 00:00:00 sleep
22749 22749 22735 pts/23 00:00:00 ps
Acima, sleep
e ps
estão em dois grupos de processos diferentes, um em segundo plano, um em primeiro plano e são diferentes do grupo de processos do shell.
Você pode fazer isso:
(man kill & sleep 1; ps -j; kill 0)
O shell interativo iniciaria um novo grupo de processos para esse subshell, e tanto o subshell quanto o man (e os outros comandos iniciados pelo man como seu pager, groff ...) estariam no mesmo grupo de processos, então kill 0
iria trabalhar lá. (o sleep
acima é para dar tempo suficiente para o pager iniciar, então podemos vê-lo na saída ps -j
antes de matá-lo).