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

10

Existem 5 processos que não podem ser eliminados por kill -9 $PID e a execução de cat /proc/$PID/cmdline irá suspender a sessão atual. Talvez sejam processos zumbis.

A execução de ps -ef or htop também interromperá a sessão atual. Mas top e ps -e estão funcionando bem.

Portanto, parece que há dois problemas no sistema de arquivos não responder.

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

Os seguintes IDs de processos 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 do qemu não funciona

|-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)
    
por Sam Stoelinga 01.07.2013 / 05:36

4 respostas

23

Você não tem zumbis. cat /proc/$PID/cmdline não teria nenhum problema com um zumbi. Se kill -9 não mata 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 erro do kernel;
  • um erro de hardware.

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

Tente cat /proc/16181/syscall para ver o processo 16181 está fazendo. Isso pode ou não funcionar dependendo de quão longe seu sistema está.

Se o problema for um sistema de arquivos de rede, você poderá forçar a desmontagem ou torná-lo online. Se o problema for um bug de kernel ou hardware, o que você pode fazer dependerá da natureza do bug. Recomenda-se a reinicialização (e a atualização para um kernel fixo ou a substituição do hardware quebrado).

    
por 02.07.2013 / 01:54
7

As outras respostas estão assumindo que esses são processos zumbis. Um processo zumbi é um processo que acabou de ser executado, mas ainda está na tabela de processos, caso o pai queira saber o status de saída. Eles são normais e init limpará automaticamente os processos zumbis que foram atribuídos a ele.

Processos de zumbis nunca devem causar problemas, então parece que isso pode não ser o seu problema. Se for uma chamada do sistema ou um driver interrompido, o processo pode estar em um estado ininterrupto. Há uma boa explicação aqui .

    
por 01.07.2013 / 09:59
1

Para encontrar processos zumbis no Linux:

# ps axo stat,ppid,pid,comm | grep -w defunct

Z 555 10242 Damn-Zombie < defunct >

Primeiro, você pode tentar enviar um sinal SIGCHLD para o processo pai do zumbi usando o comando kill. Note que o comando acima lhe dá PPID (PID do processo pai) de cada zumbi. Em nosso exemplo, o PPID do zumbi é de 250.

# sudo kill -s SIGCHLD 555

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

# sudo kill -9 555

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

    
por 01.07.2013 / 09:21
0

Você só pode matar um zumbi matando seu pai. Um processo zumbi liberou todos os seus recursos e está aguardando que seu status de saída seja capturado por seu pai. Ele se torna um zumbi quando o pai não executa wait para obter o status de saída de seu filho. Quando você mata o pai do zumbi, init pega o status de saída e o zumbi finalmente morre.

    
por 01.07.2013 / 05:38