Como matar processos zumbis no Linux

Conteúdo

Uma janela de terminal em um laptop Linux.

Programas mal escritos ou com mau funcionamento podem deixar processos zumbis à espreita dentro de seu computador Linux.. Descubra como os zumbis são criados e como, em resumo, você pode deixá-los descansar.

Como os estados procedurais funcionam no Linux

Linux, desde já, você tem que manter o controle de 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 procedimento tem uma entrada nesta lista que contém informações sobre ele.

Não há muito em cada uma das estruturas da tabela de processo. Eles seguram o identificação do processo, alguns outros itens de dados e um ponteiro para o bloco de controle de procedimento (PCB) para aquele procedimento.

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

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

  • Estado do procedimento: Os estados são descritos abaixo.
  • Número do procedimento: Seu identificador único dentro do sistema operacional.
  • Contador de programa: Quando este procedimento tem acesso à CPU, o sistema usará este endereço para encontrar a próxima instrução do procedimento a ser executado.
  • Registros: A lista de registros de CPU usados ​​por este procedimento. A lista pode conter acumuladores, registradores de índice e ponteiros de pilha.
  • Abrir lista de arquivos: Arquivos associados a este procedimento.
  • Informações de programação da CPU: Usado para definir a frequência e duração do tempo de processamento da CPU para este procedimento. A prioridade do procedimento, indicadores de fila de agendamento e outros parâmetros de agendamento devem ser registrados no PCB.
  • Informação de gerenciamento de memória: Detalhes sobre a memória usada por este procedimento, como os endereços de início e fim da memória do procedimento e ponteiros para páginas de memória.
  • E / S: Qualquer dispositivo de entrada ou saída usado pelo procedimento.

o “Status do procedimento” pode ser qualquer um dos seguintes:

  • R: Um procedimento em execução ou executável. Executando significa que está recebendo ciclos da CPU e executando. Um procedimento executável está pronto para ser executado e aguardando um slot de CPU.
  • S: Um procedimento para dormir. O procedimento está aguardando a conclusão de uma ação, como uma operação de entrada ou saída, ou que um recurso está disponível.
  • D: O procedimento está em estado de suspensão ininterrupta. Você está usando uma chamada de sistema de bloqueio e não pode continuar até que as chamadas de sistema tenham sido concluídas. Ao contrário do estado de “suspensão”, um procedimento neste estado não responderá aos sinais até que a chamada do sistema seja concluída e a execução retorne ao procedimento.
  • T: O procedimento acabou (parado) porque ele recebeu o SIGSTOP sinal. Isso só vai responder al SIGKILL o SIGCONT sinais, que encerram o procedimento ou instruem você a continuar, respectivamente. Isso é o que acontece quando você muda primeiro plano (fg) para fundo (bg) Tarefas.
  • COM: Um procedimento de zumbi. Quando um procedimento é concluído, simplesmente não vai embora. Libera qualquer memória que você está usando e remove-se da memória, mas sua entrada na tabela de processo e PCB permanece. Seu status é definido como EXIT_ZOMBIE, e seu procedimento pai é notificado (por ele SIGCHLD sinal) que o procedimento filho terminou.

No estado de zumbi, o procedimento pai chama um dos wait() famílias de funções quando o procedimento filho é criado. Em seguida, espere por uma mudança de estado no procedimento filho. O procedimento da criança foi interrompido, continuado ou eliminado por um sinal? Você acabou executando a conclusão natural do seu código??

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

RELACIONADO: Como executar e controlar processos em segundo plano no Linux

O que causa processos zumbis no Linux?

Um procedimento pai com erro ortográfico pode não chamar o wait() função quando o procedimento filho é criado. Isso significa que nada está pendente de mudanças de estado no procedimento filho, e ele SIGCHLD o sinal será ignorado. Ou talvez outro aplicativo esteja afetando a execução do procedimento principal, devido a má programação ou intenção maliciosa.

Apesar disto, se o procedimento pai não está ciente das mudanças de estado no procedimento filho, a manutenção adequada do sistema não ocorrerá. O PCB e a entrada da tabela de processos não serão removidos quando o procedimento filho terminar. Isso faz com que o estado zumbi nunca seja removido do PCB..

Zumbis usam um pouco de memória, mas geralmente eles não representam um obstáculo. A entrada na tabela de processo é pequena, mas, até que seja publicado, ID do procedimento não pode ser reutilizado. Em um sistema operacional de 64 bits, é improvável que isso cause problemas porque o PCB é muito maior do que a entrada da tabela de processo.

Muitos zumbis poderiam, possivelmente, afetam a quantidade de memória que está livre para outros processos. Apesar disto, se você tem tantos zumbis, você tem um obstáculo sério com o aplicativo principal ou um erro do sistema operacional.

Como remover processos zumbis

Você não pode matar um procedimento zumbi porque ele já está morto. Não responderá a nenhum sinal porque foi removido da memória; não há para onde enviar um SIGKILL sinal. Você pode tentar enviar o SIGCHLD sinalizar para o procedimento dos pais, mas se não funcionou quando o procedimento filho terminou, improvável que funcione agora também.

A única solução confiável é remover o procedimento principal. Quando termina, seus processos filhos são herdados pelo init processo, qual é o primeiro procedimento a ser executado em um sistema Linux (seu id de procedimento é 1).

a init O procedimento realiza regularmente a limpeza necessária de zumbis, então para matá-los, você só tem que matar o procedimento que os criou. a top O comando é uma maneira conveniente de ver se você tem zumbis.

Escreva o seguinte:

principal

Este sistema tem oito processos zumbis. Nós você pode listar estes usando o ps comando e canalizando-o para egrep. Mais uma vez, processos zumbis têm um sinalizador de status “COM” e, em geral, você também verá “extinto”.

Escreva o seguinte:

ps para | egrep "COM|extinto"

Processos zumbis são listados.

Esta é uma maneira mais simples de descobrir os IDs procedurais dos 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 procedimento do primeiro zumbi é 7641, mas precisamos encontrar o id do procedimento de seu procedimento pai. Podemos fazer isso usando ps de novo. Usaremos a opção de saída (-o) contar ps para mostrar apenas o ID do procedimento do pai e, em seguida, passá-lo com o ppid= bandeira.

O procedimento que queremos encontrar será indicado através do -p (processo) e então passar o id de procedimento do zumbi.

Por isso, escrevemos o seguinte comando para encontrar as informações do procedimento para o procedimento 7641, mas só vai relatar o ID do procedimento principal:

ps -o ppid = -p 7641

Foi mencionado que o ID do procedimento principal é 7636. Agora podemos fazer referência cruzada usando ps mais uma vez.

Vemos que isso corresponde ao nome do procedimento principal acima. Para matar o procedimento principal, use a opção SIGKILL com o comando kill da seguinte forma:

matar -SIGKILL 7636

Dependendo do proprietário do procedimento principal, é possível que você também deva usar sudo.

Zumbis não são assustadores …

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

Apesar disto, se você notar que um aplicativo ou procedimento sempre gera zumbis, isso é algo que você precisa analisar. Provavelmente é apenas um programa escrito de maneira descuidada, em cujo caso, talvez haja uma versão atualizada que limpa adequadamente após seus processos filho.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.