kill -9
( SIGKILL ) sempre funciona, desde que você tenha permissão para matar o processo. Basicamente, o processo deve ser iniciado por você e não ser setuid ou setgid, ou você deve ser root. Há uma exceção: mesmo o root não pode enviar um sinal fatal para o PID 1 (o processo init
).
No entanto, kill -9
não tem garantia de funcionar imediatamente . Todos os sinais, incluindo o SIGKILL, são entregues de forma assíncrona: o kernel pode demorar para entregá-los. Normalmente, a entrega de um sinal leva no máximo alguns microssegundos, apenas o tempo que leva para o alvo obter um intervalo de tempo. No entanto, se o alvo tiver bloqueado o sinal , o sinal será enfileirado até target desbloqueia.
Normalmente, os processos não podem bloquear o SIGKILL. Mas o código do kernel pode, e os processos executam o código do kernel quando eles chamam chamadas do sistema . O código do kernel bloqueia todos os sinais ao interromper a chamada do sistema resultaria em uma estrutura de dados mal formada em algum lugar no kernel, ou mais geralmente em alguma invariante do kernel sendo violada. Portanto, se (devido a um bug ou má design) uma chamada do sistema for bloqueada indefinidamente, pode não haver maneira de eliminar o processo. (Mas o processo será eliminado se completar a chamada do sistema.)
Um processo bloqueado em uma chamada de sistema está em suspensão ininterrupta . O comando ps
ou top
irá (na maioria dos unices) mostrá-lo no estado D
(originalmente para “ d isk”, eu acho).
Um caso clássico de sono longo e ininterrupto é o processo de acessar arquivos pelo NFS quando o servidor não está respondendo ; implementações modernas tendem a não impor suspensão ininterrupta (por exemplo, no Linux, a opção intr
mount permite que um sinal interrompa os acessos a arquivos NFS).
Às vezes, você pode ver as entradas marcadas com Z
(ou H
no Linux, não sei qual é a diferença) na ps
ou top
output. Tecnicamente, estes não são processos, eles são processos zumbis, que nada mais são do que uma entrada na tabela de processos, mantida de forma que o processo pai possa ser notificado da morte de seu filho. Eles vão embora quando o processo pai presta atenção (ou morre).