O que kill 0 realmente faz? [fechadas]

22

No man page, diz:

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

E eu tentei assim no bash:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

Aqui 0é usado como pid. Como eu entendi, kill 0matará todos os processos no processo atual, o que inclui pid15247. No entanto, não fez nada neste exemplo. Alguém tem idéias sobre como usá-lo?

Arma de fogo
fonte
Ele envia um SIGTERMpara o processo, o que foi feito. O mancomando optou por ignorá-lo.
Jordanm
5
@jordanm, no. um trabalho iniciado por um shell interativo possui um grupo de processos diferente do que o shell. É assim que o shell pode colocá-lo em primeiro plano e em segundo plano. Veja ps -jpara ver os grupos de processos.
Stéphane Chazelas
1
Esta questão é na verdade uma cópia da pergunta do Superusuário. O que kill 0 realmente faz? (que foi migrado do StackOverflow). Veja também perguntas sobre kill -0(nota o traço), que é um tópico diferente, em StackOverflow e aqui em Unix.SE .
Adam Katz

Respostas:

27

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 interativo de tarefas de shell é o principal motivo de sua existência).

Você notará que, ao digitar 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 é alcançado com grupos de processos. Um trabalho é 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 os IDs de grupo de processos e de sessão com ps -j( jpara Jcontrole de ob).

Para matar 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 /bin/kill 0:, o shell iniciará um novo trabalho para executar esse killcomando, e killsomente se matará.

killnormalmente é um shell embutido, portanto kill, 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 sleepe psestão em dois grupos de processos diferentes, um em segundo plano, um em primeiro plano e eles são diferentes do grupo de processos do shell.

Você poderia fazer:

(man kill & sleep 1; ps -j; kill 0)

O shell interativo iniciaria um novo grupo de processos para esse subshell, e o subshell e man (e os outros comandos iniciados por man como seu pager, groff ...) estariam no mesmo grupo de processos, portanto kill 0, trabalhariam lá. (o que foi sleepdito acima é para dar tempo suficiente para o pager iniciar, para que possamos vê-lo na ps -jsaída antes de matá-lo).

Stéphane Chazelas
fonte
kill -- -$xna verdade, diz bash: kill: (-63531) - No such processno lançamento do bash 5.0.11 (1) no MacOS 10.14, mas é certo que o processo existe e está em execução. pkill -Pfunciona bem
kyb 25/09
1
@kyb $ x deve ser um ID de grupo de processos e não um ID de processo. Veja a saída de ps -jpara descobrir sobre pgids
Stéphane Chazelas