Como matar processos zombie no Linux

Vamos ver como matar processos de zombies no Linux. Mas antes de o fazermos, precisamos de explicar o que são estes processos.

O que é um processo zombie?

Por vezes somos confrontados com processos Zombie, Defunct ou órfãos. Os processos nos sistemas Unix/Linux têm uma hierarquia, quando um processo cria outros processos, estes novos processos são chamados de processos infantis e o criador dos processos é o processo parental. Normalmente, quando tudo funciona como esperado, se o processo dos pais morre, as crianças também morrem.

Quando falamos de processos Zombies, Defunct ou Huerfano, estamos a falar de processos infantis cujos pais morreram e, aos olhos do sistema, eles também deveriam estar mortos, mas quando estão na lista de processos são marcados como Defunct. Isto raramente acontece, e quando acontece, encontramos problemas causados por estes processos, tais como processos que não funcionam correctamente, lentidão, etc.

Detecção de processos de zombies

Usando o comando ps, podemos detectar processos de zombies ou órfãos. Para o fazer, executamos o comando:

ps -Al

Por exemplo:

ger@DESKTOP-Q1D33PH:~$ ps -Al
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 1 0 0 80 0 - 2235 ? ? 00:00:00 init
0 S 0 8 1 0 80 0 - 2235 - tty1 00:00:00 init
0 S 1000 9 8 0 80 0 - 4229 - tty1 00:00:01 bash
0 S 0 66 1 0 80 0 - 2235 - tty2 00:00:00 init
0 S 1000 67 66 0 80 0 - 4229 - tty2 00:00:01 bash
0 S 1000 401 9 0 80 0 - 4671 - tty1 00:00:00 ssh
0 R 1000 418 67 0 80 0 - 4274 - tty2 00:00:00 ps
ger@DESKTOP-Q1D33PH:~$

A coluna pid indica o seu ID de processo. A coluna ppid indica o ID do processo pai.

Na coluna S (que indica o estado) podemos ver os seguintes valores:

  • D- processo à espera de alguma operação de E/S para terminar.
  • Processo R- running
  • S- processo suspenso (está à espera de ser executado)
  • Processo Z- zombie

Quando um processo dos pais morre e a criança não morre, duas coisas podem acontecer:

  • Se for adoptado pelo processo dos pais, o processo com o ID 1, torna-se um processo órfão.
  • Se o acima mencionado não acontecer, será deixado sem uma identificação de processo parental e tornar-se-á num zombie ou defunto.

Causas deste comportamento

Há diferentes causas que podem levar a este comportamento. Algumas delas são as seguintes:

  • Quando o processo dos pais é morto, a criança tem um bloqueio de hardware, por exemplo, armazenamento não responsivo.
  • Há um erro no software que faz com que o processo não termine a tempo.

Como se mata um processo zombie?

Bem, há várias maneiras, mas por vezes, se o impasse for gerado por leituras e escritos porque é um processo esquecido no sistema, é possível que a maneira mais rápida seja reiniciar o sistema. Antes de chegarmos a esse ponto, vejamos várias formas de matar processos defuntos:

A primeira forma que podemos encontrar é a forma mais típica de matar à força um processo, ou seja, a utilização:

kill -9 ID_DE_PROCESO

Eliminação em massa de zombies

Se quisermos remover maciçamente os processos de zombies, temos as seguintes opções, em que a forma de procurar processos muda acima de tudo:

kill -9 `ps xawo state=,pid=|sed -n 's/Z //p'`

Outra opção é:

kill -9 `ps -xaw -o state -o ppid | grep Z | grep -v PID | awk '{print $2}'`

Uma terceira opção é:

ps -Ao state,pid | awk '$1=="2" {print $2}' | xargs kill -s SIGKILL

Uma quarta opção é:

ps -xaw -o state,ppid | grep Z | grep -v PID | awk '{ print $2 }' | xargs kill -9

Finalmente temos este último comando, que varia na execução da forma como envia sinais HUP para os processos zombies:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}'`

É possível que nenhum dos comandos acima referidos ponha fim ao processo zombie, se assim for, infelizmente, o sistema terá de ser reiniciado.

 

 

Deixe uma resposta