Por que matar -9 0 em um mac simplesmente mata o shell bash?

5

Estou tentando ver o que acontece quando tento matar o processo kernel_task . Como kill -9 pid é o comando para forçar o encerramento de um processo, e kernel_task 's pid é 0, simplesmente executei kill -9 0 .

Em vez de obter Permission Denied ou Operation not permitted ao matar um processo raiz, você simplesmente recebe isto:

Last login: Thu Jun 18 16:55:10 on ttys005
MacBook-Air:~ james$ kill -9 0

[Process completed]

... o que é estranho porque tentar matar launchd (um nível abaixo de kernel_task ) lhe dá isto:

-bash: kill: (1) - Operation not permitted

e todos os outros processos raiz.

Por que diabos ele acabou de terminar o processo que chamou o comando, em vez de enviar Operation not permitted , como todos os outros processos raiz?

pontos de bônus, se você pode me dizer a resposta a esta pergunta: Se você criar um script que tente matar kernel_task (e ignora SIGTERM ), executá-lo produzirá Killed: 9 e retornará ao bash. Por que isso é colocado em stdout quando o mata? Por que não algo mais descritivo?

    
por noɥʇʎԀʎzɐɹƆ 18.06.2015 / 23:10

1 resposta

4

and kernel_task's pid is 0

Eles provavelmente usam o PID 0, porque é um PID reservado e, como tal, você não pode enviar sinais para o processo.

I simply ran kill -9 0.

O comando * nix kill é mais ou menos um front-end direto para a chamada do sistema kill . Da documentação da chamada do sistema:

If pid is zero:
      Sig is sent to all processes whose group ID is equal to the process group ID of the sender, and
      for which the process has permission; this is a variant of killpg(2).

Em outras palavras, no seu caso, kill -9 0 é apenas uma maneira elegante de enviar o sinal (fatal) para si mesmo. ( Mais sobre grupos de processos. )

Why the heck does it just terminate the process that called the command

O kill (a menos que você tenha ajustado as configurações do shell) é um comando shell embutido. Em outras palavras, o shell chama o kill syscall e isso faz com que ele se mate.

Tente o mesmo, mas com o comando kill externo, por ex. %código%. Nesse caso, apenas o /bin/kill -9 0 seria eliminado.

    
por 19.06.2015 / 01:08

Tags