Como matar processos zumbis no Linux

Uma janela de terminal em um laptop Linux.
Fatmawati Achmad Zaenuri / Shutterstock

Programas mal escritos ou com desempenho ruim podem deixar processos zumbis à espreita dentro de seu computador Linux. Descubra como os zumbis são criados e como você pode finalmente colocá-los para descansar.

Como os estados de processo funcionam no Linux

O Linux, é claro, precisa controlar todos os aplicativos e daemons em execução no seu computador. Uma das maneiras de fazer isso é mantendo a tabela de processos. Esta é uma lista de estruturas na memória do kernel. Cada processo possui uma entrada nesta lista que contém algumas informações sobre ele.

Não há muito em cada uma das estruturas da tabela de processos. Eles contêm o ID do processo , alguns outros itens de dados e um ponteiro para o bloco de controle do processo (PCB) desse processo.

É o PCB que contém os muitos detalhes que o Linux precisa procurar ou configurar para cada processo. O PCB também é atualizado conforme um processo é criado, dado o tempo de processamento e finalmente destruído.

O Linux PCB contém mais de 95 campos. É definido como uma estrutura chamada task_struct.he tem mais de 700 linhas. O PCB contém os seguintes tipos de informações:

  • Estado do processo : os estados são descritos a seguir.
  • Número do processo : seu identificador exclusivo no sistema operacional.
  • Contador de programa : Na próxima vez que este processo tiver acesso à CPU, o sistema usará este endereço para encontrar a próxima instrução do processo que deve ser executada.
  • Registros : A lista de registros da CPU usados ​​por este processo. A lista pode conter acumuladores, registradores de índice e ponteiros de pilha.
  • Lista de arquivos abertos : Arquivos associados a este processo.
  • Informações de agendamento da CPU : usado para determinar com que frequência e por quanto tempo o tempo de processamento da CPU é concedido a esse processo. A prioridade do processo, ponteiros para as filas de agendamento e outros parâmetros de agendamento devem ser registrados no PCB.
  • Informações de gerenciamento de memória : detalhes sobre a memória que este processo está usando, como os endereços inicial e final da memória do processo e ponteiros para as páginas da memória.
  • Informações de status de E / S : Quaisquer dispositivos de entrada ou saída usados ​​pelo processo.
Recomendado:  Correção: por que meu controle remoto da Apple TV não funciona?

O “Estado do Processo” pode ser qualquer um dos seguintes:

  • R: Um processo em execução ou executável. Executando significa que está recebendo ciclos da CPU e executando. Um processo executável está pronto para ser executado e aguardando um slot de CPU.
  • S: Um processo de sono. O processo está aguardando a conclusão de uma ação, como uma operação de entrada ou saída, ou a disponibilização de um recurso.
  • D: O processo está em um estado de suspensão ininterrupto. Ele está usando uma chamada de sistema de bloqueio e não pode continuar até que as chamadas de sistema sejam concluídas. Ao contrário do estado “Suspensão”, um processo neste estado não responderá aos sinais até que a chamada do sistema seja concluída e a execução retorne ao processo.
  • T: O processo terminou (parou) porque recebeu o SIGSTOPsinal. Ele responderá apenas aos sinais SIGKILL ou SIGCONT, que interrompem o processo ou o instruem a continuar, respectivamente. Isso é o que acontece quando você troca do primeiro plano ( fg) para o segundo plano (bg) tarefas.
  • Z: Um processo de zumbi. Quando um processo é concluído, ele não simplesmente desaparece. Ele libera qualquer memória que está usando e se remove da memória, mas sua entrada na tabela de processos e PCB permanece. Seu estado é definido como EXIT_ZOMBIEe seu processo pai é notificado (pelo SIGCHLDsinal) de que o processo filho foi concluído.

No estado Zumbi, o processo pai chama uma das wait()famílias de funções quando o processo filho é criado. Em seguida, aguarda uma mudança de estado no processo filho. O processo filho foi interrompido, continuado ou eliminado por um sinal? Terminou executando através da conclusão natural de seu código?

Se a mudança de estado significar que o processo filho parou de funcionar, seu código de saída será lido. Em seguida, o PCB da criança é destruído e sua entrada na tabela de processos é removida. Idealmente, tudo isso acontece em um piscar de olhos, e os processos no estado zumbi não existem por muito tempo.

Recomendado:  Análise do Samsung Galaxy Buds 2 Pro: bom para fãs de Android, ótimo para fãs de Samsung

O que causa os processos zumbis no Linux?

Um processo pai mal escrito pode não chamar a wait()função quando o processo filho é criado. Isso significa que nada está observando as mudanças de estado no processo filho e o SIGCHLDsinal será ignorado. Ou talvez outro aplicativo esteja afetando a execução do processo pai, seja devido a uma programação ruim ou intenção maliciosa.

No entanto, se o processo pai não estiver observando as mudanças de estado no processo filho, a manutenção adequada do sistema não ocorrerá. O PCB e a entrada na tabela de processos não serão removidos quando o processo filho terminar. Isso faz com que o estado zumbi nunca seja removido do PCB.

Os zumbis usam um pouco de memória, mas geralmente não representam um problema. A entrada na tabela de processos é pequena, mas, até que seja liberada, o ID do processo não pode ser reutilizado. Em um sistema operacional de 64 bits, é improvável que cause problemas porque o PCB é muito maior do que a entrada da tabela de processos.

Um grande número de zumbis pode, possivelmente, afetar a quantidade de memória que está livre para outros processos. Se você tem tantos zumbis, no entanto, você tem um problema sério com o aplicativo pai ou um bug do sistema operacional.

Como remover processos zumbis

Você não pode matar um processo zumbi porque ele já está morto. Ele não responderá a nenhum sinal porque foi removido da memória – não há para onde enviar um SIGKILLsinal. Você pode tentar enviar o SIGCHLDsinal para o processo pai, mas se não funcionou quando o processo filho terminou, também é improvável que funcione agora.

A única solução confiável é eliminar o processo pai. Quando é finalizado, seus processos filhos são herdados pelo initprocesso, que é o primeiro processo a ser executado em um sistema Linux (seu ID de processo é 1).

Recomendado:  Os melhores conversores de vídeo grátis

O initprocesso realiza regularmente a limpeza necessária dos zumbis, portanto, para matá-los, basta matar o processo que os criou. O topcomando é uma maneira conveniente de ver se você tem zumbis.

Digite o seguinte:

topo

topo em uma janela de terminal

Este sistema possui oito processos zumbis. Podemos listá-los usando o pscomando e direcionando-o para egrep . Novamente, os processos zumbis têm um sinalizador de estado de “Z” e normalmente você também verá “extinto”.

Digite o seguinte:

ps aux | egrep "Z | extinto"

ps aux |  egrep "Z | extinto" em uma janela de terminal

Os processos zumbis são listados.

Saída de ps aux |  egrep "Z | extinto" em uma janela de terminal

Esta é uma maneira mais simples de descobrir os IDs de processos de zumbis do que rolar para frente e para trás top. Também vemos que um aplicativo chamado “badprg” gerou esses zumbis.

O ID do processo do primeiro zumbi é 7641, mas precisamos encontrar o ID do processo de seu processo pai. Podemos fazer isso usando ps novamente. Usaremos a opção de saída ( -o) para informar psa exibição apenas do ID de processo do pai e, em seguida, passá-lo com o ppid=sinalizador.

O processo que queremos encontrar será indicado usando a -popção (processo) e, em seguida, passando o ID do processo do zumbi.

Portanto, digitamos o seguinte comando para pesquisar as informações do processo para o processo 7641, mas ele reportará apenas o ID do processo pai:

ps -o ppid = -p 7641

ps -o ppid = -p 7641 em uma janela de terminal

Disseram que o ID do processo pai é 7636. Agora podemos fazer uma referência cruzada usando psmais uma vez.

ps -e |  grep 7636 em uma janela de terminal

Vemos que corresponde ao nome do processo pai anterior. Para encerrar o processo pai, use a opção SIGKILL com o comando kill da seguinte maneira:

kill -SIGKILL 7636

Dependendo do proprietário do processo pai, você também pode precisar usar sudo.

Zumbis não são assustadores …

… A menos que eles estejam em uma horda enorme. Alguns não são nada com que se preocupar e uma simples reinicialização os eliminará.

No entanto, se você perceber que um aplicativo ou processo está sempre gerando zumbis, é algo que você deve examinar. É mais provável que seja apenas um programa escrito de maneira descuidada; nesse caso, talvez haja uma versão atualizada que seja devidamente limpa após seus processos filho.