O que kill 0 realmente faz?

10

No man page, diz:

          0      All processes in the current process group are signaled

E eu tentei assim:

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

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
Qual shell você está usando?
FatalError
@FatalError eu estou usando Bash
Firegun
Veja também o clone Unix.SE desta questão .
Adam Katz

Respostas:

4

Não consegui encontrar uma nota de como kill 0se comporta na minha página de manual kill (debian).

Mas tenho dois comentários:

(1) "Grupo de processos" pode não ser o que você espera. Você pode exibir o PGID (Process Group ID) com ps -o "%p %P %r %c %a":

$ ps -o "%p %P %r %c %a"
  PID  PPID  PGID COMMAND         COMMAND
12124 12123 12124 zsh             -zsh
12212 12124 12212 man             man kill
12226 12212 12212 less            less
12302 12124 12302 ps              ps -o %p %P %r %c %a

Portanto, o manconjunto com a ferramenta de paginação exibida ( less) está no mesmo grupo de processos, mas isso é diferente do do shell (zsh no meu caso).

(2) Provavelmente existem dois killcomandos diferentes . Um embutido bash(veja bash (1), Seção "COMANDOS DE CONSTRUÇÃO DE SHELL") e o externo /bin/kill. Esses dois podem se comportar de maneira diferente! Você pode indicar explicitamente qual você deseja executar digitando builtin killou em command killvez de kill. O comando externo você também pode executar, especificando o caminho: /bin/kill.

mpy
fonte
11
PPIDé o ID do processo pai , que geralmente é, mas não necessariamente, o ID do grupo de processos. A coluna correta é PGID, que não aparece na pssaída padrão ; você precisa usar a -oopção para construir um formato personalizado que o inclua.
chepner
@chepner: Você está absolutamente certo, obrigado! Fiquei confuso com a página de manual ps (1) do Cygwin, que afirma: "-l, --long: show uids do processo, ppids, pgids, winpids". Que vergonha, editei minha resposta de acordo. No entanto, minha declaração (apenas man + pager tem o mesmo PGID) está correta agora, conforme pretendido. (Antes mesmo que a sentença estava errado :-()
mpy
1

Para interromper todos os seus processos e fazer logoff, digite:

kill -kill 0

Isso envia o sinal 9, o sinal SIGKILL, para todos os processos com um ID de grupo de processos igual ao ID do grupo de processos de remetentes. Como o shell não pode ignorar o sinal SIGKILL, isso também interrompe o shell de login e o desconecta.

Este é o Manual AIX da IBM, mas talvez o conceito se aplique.

Essa funcionalidade não existe no Linux "kill" (como posso ver); mas é assim que o "kill" se comporta:

Matar 0 não mata o pid 0. Em vez disso, é uma opção no kill matar todos os processos no grupo atual . Com seu comando, você está matando tudo no ID do grupo de processos (GID) do shell que emitiu o comando kill.

Dane Balia
fonte