Eu tenho um processo com o qual não posso matar kill -9 <pid>
. Qual é o problema nesse caso, principalmente porque sou o proprietário desse processo. Eu pensei que nada poderia escapar dessa kill
opção.
kill -9
( SIGKILL ) sempre funciona, desde que você tenha permissão para interromper 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 init
processo).
No entanto, kill -9
não é garantido que funcione imediatamente . Todos os sinais, incluindo o SIGKILL, são entregues de forma assíncrona: o kernel pode demorar para entregá-los. Geralmente, a entrega de um sinal leva no máximo alguns microssegundos, apenas o tempo necessário para o alvo obter uma fatia de tempo. No entanto, se o alvo tiver bloqueado o sinal , o sinal ficará na fila de espera até que o alvo o desbloqueie.
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 chamam chamadas do sistema . O código do kernel bloqueia todos os sinais ao interromper a chamada do sistema, resultando em uma estrutura de dados mal formada em algum lugar do kernel ou, mais geralmente, em alguma invariância do kernel sendo violada. Portanto, se (devido a um erro ou erro de design) uma chamada do sistema é bloqueada indefinidamente, pode não haver maneira de eliminar o processo. (Mas o processo será interrompido se alguma vez concluir a chamada do sistema.)
Um processo bloqueado em uma chamada do sistema está em suspensão ininterrupta . O comando ps
ou top
(na maioria das unidades) o mostrará em estado D
(originalmente para " d isk", eu acho).
Um caso clássico de suspensão ininterrupta longa é o processo de acesso a 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 intr
opção mount permite que um sinal interrompa o acesso a arquivos NFS).
Às vezes, você pode ver entradas marcadas Z
(ou H
no Linux, não sei qual é a distinção) na saída ps
ou top
. Tecnicamente, esses não são processos, são processos zumbis, que nada mais são do que uma entrada na tabela de processos, mantidos em torno para que o processo pai possa ser notificado da morte de seu filho. Eles desaparecem quando o processo pai presta atenção (ou morre).
man 5 nfs
: "A opçãointr
/nointr
mount está obsoleta após o kernel 2.6.25. Somente o SIGKILL pode interromper uma operação NFS pendente nesses kernels e, se especificada, essa opção de montagem é ignorada para fornecer compatibilidade com versões anteriores dos kernels."sshfs
processo (e da mesma forma que com qualquer outro sistema de arquivos FUSE: você sempre pode desmontar à força dessa maneira).Algum processo existe e não pode ser eliminado devido a:
top
que Z é sinalizadotop
que é sinalizado por D.fonte
Parece que você pode ter um processo de zumbi . Isso é inofensivo: o único recurso que um processo zumbi consome é uma entrada na tabela de processos. Ele desaparecerá quando o processo pai morrer ou reagir à morte de seu filho.
Você pode ver se o processo é um zumbi usando
top
ou o seguinte comando:fonte
ps
. Quem pode ter certeza de que o campo obrigatório será sempre o 8º, com todas as implementaçõesps
em todos os Unices?Verifique seu
/var/log/kern.log
e/var/log/dmesg
(ou equivalentes) em busca de pistas. Na minha experiência, isso aconteceu comigo apenas quando a conexão de rede de uma montagem NFS caiu de repente ou um driver de dispositivo travou. Poderia acontecer se um disco rígido travar também, acredito.Você pode usar
lsof
para ver quais arquivos de dispositivo o processo abriu.fonte
kill -9
normalmente não funcionava, mesmo depois de esperar 60 minutos. A única solução foi reiniciar.Se as respostas de @ Maciej e @ Gilles não resolverem o seu problema e você não reconhecer o processo (e perguntar o que há na sua distribuição não gera respostas). Verifique o Rootkit e quaisquer outros sinais de que você pertence . Um rootkit é mais do que capaz de impedir que você interrompa o processo. De fato, muitos são capazes de impedir que você os veja. Mas se eles esquecerem de modificar 1 programa pequeno, poderão ser detectados (por exemplo, eles modificaram
top
, mas nãohtop
). Provavelmente não é esse o caso, mas é melhor prevenir do que remediar.fonte
Matar, na verdade, significa enviar um sinal. existem vários sinais que você pode enviar. kill -9 é um sinal especial.
Ao enviar um sinal, o aplicativo lida com ele. caso contrário, o kernel lida com isso. para que você possa capturar um sinal em seu aplicativo.
Mas eu disse que matar -9 era especial. É especial porque o aplicativo não o entende. vai direto para o kernel, que realmente mata o aplicativo na primeira oportunidade possível. em outras palavras, mata-o morto
kill -15 envia o sinal SIGTERM que significa SIGNAL TERMINATE em outras palavras, diz ao aplicativo para sair. Essa é a maneira mais fácil de dizer a um aplicativo que é hora de desligar. mas se o aplicativo não estiver respondendo, kill -9 o matará.
se kill -9 não funcionar, provavelmente significa que seu kernel está fora de sintonia. uma reinicialização está em ordem. Não me lembro de isso ter acontecido.
fonte
Primeiro, verifique se é um processo Zombie (o que é muito possível):
Você verá algo como:
(Observe o "Z" à esquerda)
Se a quinta coluna não for 1, significa que ele possui um processo pai. Tente matar o ID do processo pai .
Se o seu PPID = 1, NÃO O MATE !! , pense em quais outros dispositivos ou processos podem estar relacionados a ele.
Por exemplo, se você estava usando um dispositivo montado ou samba, tente desmontá-lo. Isso pode liberar o processo Zombie.
NOTA : Se
ps -Al
(outop
) mostrar um "D" em vez de "Z", isso poderá estar relacionado à montagem remota (como o NFS). Na minha experiência, a reinicialização é o único caminho a percorrer, mas você pode verificar as outras respostas que abordam esse caso em mais detalhes.fonte
O processo init é imune ao SIGKILL.
Isso também é válido para os threads do kernel, ou seja, "processos" com um PPID igual a 0.
fonte
Como outros já mencionaram, um processo em sono ininterrupto não pode ser morto imediatamente (ou, em alguns casos, de maneira alguma). Vale ressaltar que outro estado do processo, TASK_KILLABLE, foi adicionado para resolver esse problema em determinados cenários, particularmente no caso comum em que o processo está aguardando no NFS. Veja http://lwn.net/Articles/288056/
Infelizmente, não acredito que isso seja usado em nenhum lugar do kernel, exceto no NFS.
fonte
ls
processo ao acessar umasshfs
montagem, quando o servidor remoto se tornou inacessível. Existe uma solução para o FUSE ou sshfs, que eu possa usar no futuro para evitar essas situações? Kernel 2.6.30Fiz um pequeno roteiro que me ajudou bastante a dar uma olhada!
Você pode usá-lo para eliminar qualquer processo com um determinado nome em seu caminho (preste atenção a isso !!) ou pode eliminar qualquer processo de um determinado usuário usando o parâmetro "-u nome de usuário".
fonte
Há casos em que, mesmo que você envie um kill -9 para um processo, esse pid será interrompido, mas o processo será reiniciado automaticamente (por exemplo, se você tentar com
gnome-panel
ele, será reiniciado): poderia ser esse o caso aqui?fonte
a partir daqui originalmente :
verifique se strace mostra alguma coisa
tente anexar ao processo com gdb
se o processo estava interagindo com um dispositivo que você pode desmontar, remova o módulo do kernel ou desconecte / desconecte fisicamente ... tente isso.
fonte
Eu tive esse problema. Este foi um programa que eu havia iniciado
strace
e interrompido com oCtrl
+C
. Acabou em um estadoT
(rastreado ou parado). Não sei exatamente como aconteceu, mas não foi matávelSIGKILL
.Para encurtar a história, consegui matá-lo com
gdb
:fonte
Com base em uma pista da resposta de gilles, eu tinha um processo marcado como "Z" no topo (
<defunct>
em ps) que estava usando recursos do sistema, ele até tinha uma porta aberta que estava LISTEN'ing e você podia conectar-se a essa porta. Isso foi depois de executar umkill -9
. Seu pai era "1" (ou sejainit
), então, teoricamente, deveria ser repetido e desaparecer. Mas não era, estava por aí, embora não estivesse correndo e "não morrendo"Então, no meu caso, era zumbi, mas ainda consumia recursos ... FWIW.
E não era killable por qualquer número de
kill -9
'sE seu pai era,
init
mas não estava sendo colhido (limpo). Ou seja,init
teve um filho zumbi.E a reinicialização não era necessária para corrigir o problema. Embora uma reinicialização "tivesse funcionado" em torno do problema / o tornasse mais rápido. Apenas não gracioso, o que ainda era possível.
E era uma porta LISTEN de propriedade de um processo zumbi (e algumas outras portas também, como o status CLOSE_WAIT, conectavam host local a host local). E ainda aceitava conexões. Mesmo como um zumbi. Eu acho que ainda não havia conseguido limpar as portas, portanto as conexões recebidas ainda foram adicionadas ao backlog da porta de escuta do tcp, embora elas não tivessem chance de serem aceitas.
Muitos dos itens acima são declarados como "impossíveis" em vários lugares nas interwebs.
Acontece que eu tinha um encadeamento interno que estava executando uma "chamada de sistema" (ioctl nesta instância) que estava demorando algumas horas para retornar (esse era o comportamento esperado). Aparentemente, o sistema não pode matar o processo "até o fim" até retornar da
ioctl
chamada, suponha que entre no território do kernel. Depois de algumas horas, as coisas foram esclarecidas e as tomadas foram fechadas automaticamente, etc., conforme o esperado. Isso é algum tempo definhando no corredor da morte! O núcleo estava esperando pacientemente para matá-lo.Então, para responder ao OP, às vezes você precisa esperar. Muito tempo. Então a matança finalmente levará.
Verifique também o dmesg para ver se houve um pânico no kernel (ou seja, bug do kernel).
fonte