Como matar um processo que não pode ser morto sem reiniciar?

11

Existem 5 processos que não podem ser eliminados kill -9 $PIDe a execução cat /proc/$PID/cmdlinetravará a sessão atual. Talvez sejam processos zumbis.

A execução ps -ef or htoptambém interromperá a sessão atual. Mas tope ps -eestão funcionando bem.

Portanto, parece que há dois problemas que o sistema de arquivos não está respondendo.

Esta é uma máquina de produção executando máquinas virtuais, portanto, a reinicialização não é uma opção.

Os seguintes IDs de processo não estão funcionando: 16181 16765 5985 7427 7547

O pai desses processos é init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

E um dos processos qemu não está funcionando

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)
Sam Stoelinga
fonte
1
Os processos zumbis não devem causar problemas. Se o número de processos Zombie for tão grande que exceda o limite de processos no servidor, isso causará um problema.
Raza
@ Salton: Não podemos usar ps -ef e htop, por isso temos alguns problemas, talvez o que estamos vendo não seja chamado de processo de zumbi?
Sam Stoelinga
1
Você pode tentar rastrear usando /usr/bin/strace ps -efpara ver onde exatamente ps -efestá pendurado.
Raza
2
Como você determinou que esses são zumbis? Parece um processo pendurado. Funciona ps -ele em que estado esses processos estão?
Nils
No final, o cliente ainda decidiu reiniciar a máquina, pois os problemas estavam ficando cada vez piores. Obrigado por toda a entrada. Aprendemos muito sobre zumbis e processos ininterruptos.
Sam Stoelinga

Respostas:

22

Você não tem zumbis. cat /proc/$PID/cmdlinenão teria nenhum problema com um zumbi. Se kill -9não interromper o programa , significa que o programa está executando alguma operação de E / S ininterrupta. Isso geralmente indica uma das três coisas:

  • um sistema de arquivos de rede que não está respondendo;
  • um bug no kernel;
  • um bug de hardware.

Utilitários como esse pspodem travar se tentarem ler algumas informações, como o caminho do processo executável que o kernel não está fornecendo por um dos motivos acima.

Tente cat /proc/16181/syscallver qual processo 16181 está fazendo. Isso pode ou não funcionar, dependendo da distância do seu sistema.

Se o problema for um sistema de arquivos de rede, você poderá desmontá-lo à força ou torná-lo online. Se o problema for um erro de kernel ou hardware, o que você pode fazer dependerá da natureza do erro. É altamente recomendável reinicializar (e atualizar para um kernel fixo ou substituir o hardware quebrado).

Gilles 'SO- parar de ser mau'
fonte
Gato nunca responde. Eu não acho que isso seja um bug. Eu acho que é um "recurso".
Owl
7

As outras respostas estão assumindo que estes são processos zumbis. Um processo zumbi é um processo que terminou a execução, mas ainda está na tabela de processos, caso o pai queira saber o status de saída. Isso é normal e initlimpará automaticamente os processos zumbis atribuídos a ele.

Os processos zumbis nunca devem travar nada, portanto parece que esse não é o seu problema. Se for uma chamada do sistema ou driver interrompido, o processo poderá estar em um estado ininterrupto. Há uma boa explicação aqui .

David Baggerman
fonte
Muitos processos zumbis podem impedir o forkêxito (quando nrpocé difícil ), porque eles ainda ocupam espaço na tabela de processos.
precisa saber é o seguinte
2

Para encontrar processos zumbis no Linux:

$ ps axo stat, ppid, pid, comm | grep -w desativado

Z 555 10242 Maldito Zumbi <extinto>

Primeiro, você pode tentar enviar o sinal SIGCHLD para o processo pai do zumbi usando o comando kill. Observe que o comando acima fornece o PPID (PID do processo pai) de cada zumbi. No nosso exemplo, o PPID do zumbi é 555.

$ sudo kill -s SIGCHLD 555

Se um processo zumbi ainda não desaparecer, você pode matar o processo pai (por exemplo, 555) do zumbi.

$ sudo kill -9 555

Uma vez que seu processo pai seja morto, o zumbi será adotado pelo processo init, que é o pai de todos os processos no Linux. O processo init pede periodicamente wait()para colher qualquer processo zumbi.

HamTheAstroChimp
fonte
Essa é a verdadeira resposta. Matar os pais funcionou, obrigado.
Andrew
1

Você só pode matar um zumbi matando seu pai. Um processo zumbi liberou todos os seus recursos e aguarda o status de saída ser escolhido pelo pai. Torna-se um zumbi quando o pai não executa um waitpara pegar o status de saída do filho. Quando você mata o pai do zumbi, initpega o status de saída e o zumbi finalmente morre.

unxnut
fonte
Então você quer que eu mate init? Não está claro a partir da pergunta desculpe hehe, mas o pai parece ser o init :( Eu editei a pergunta.
Sam Stoelinga
4
Não, queremos que você não tente matar o zumbi. Você não pode matar um zumbi. Este FAQ é tão antigo quanto o próprio Unix.
Tripleee
@ tripleee: Sim, foi o que eu entendi. Talvez o que eu estou tendo não seja um zumbi. O htop não está funcionando e cat / proc / $ pid / cmdline ou ls / proc / $ pid / também não estão funcionando. Normalmente isso não acontece com zumbis, por isso perguntei aqui, esse não é um problema comum. Eu verifiquei várias respostas que dizem para você matar o pai, o que é init no meu caso ou para reiniciar.
Sam Stoelinga
1
"Matar os pais" é o caminho para colher um zumbi comum. Você não pode matar init. Se um zumbi é reparado init, você não pode matá-lo.
Tripleee 01/07/2013