Um processo zumbi no Linux se refere àqueles processos já mortos, mas, de uma forma ou de outra, ainda estão presentes na tabela de processos do sistema. A lacuna é que, por algum motivo, esse processo não foi limpo pelo pai da tabela de processos. Normalmente, isso acontece após a conclusão do processo de execução.
A forma usual de operação no Linux é que depois que um processo conclui sua execução, ele notifica seu pai, que é responsável por remover o processo da tabela. Infelizmente, o pai é incapaz de remover o processo da memória nos casos em que o pai não consegue ler o status do filho. É assim que temos processos mortos na tabela de processos. São o que chamamos de processos zumbis.
O que causa os processos do Linux Zombie?
Quando o processo filho é criado, um processo pai mal escrito pode falhar ao chamar a função wait (). Como resultado, seus filhos zumbis permanecerão na memória até que sejam extintos.
Isso significa que nada está monitorando o processo infantil para mudanças de estado, e o sinal SIGCHLD será ignorado. Talvez outro aplicativo esteja interferindo na execução do processo pai, seja por meio de programação ruim ou intenção maliciosa.
A manutenção adequada do sistema não ocorrerá se o processo pai não estiver observando as mudanças de estado no processo filho.
Quando o processo infantil terminar, o PCB e a entrada na tabela de processo não serão removidos. O estado de zumbi nunca é removido do PCB como resultado deste.
Os zumbis têm alguma memória, mas geralmente não é um problema. Como os sistemas Linux têm um número finito de PIDs (embora um grande número), se PIDs suficientes estiverem zumbidos, nenhum outro processo pode ser iniciado. É duvidoso que isso aconteça.
No entanto, os processos zumbis sugerem que algo deu errado com um aplicativo e que um programa específico pode ter um bug.
Bugs de software em data centers não devem ser tolerados e devem ser corrigidos.
Você deve ficar atento e destruir processos zumbis até que a falha seja corrigida.
O ID do processo não pode ser reutilizado até que seja lançado, então a entrada da tabela do processo é minúscula.
Como o PCB é muito maior do que a entrada da tabela de processos em um sistema operacional de 64 bits, é improvável que cause problemas.
A quantidade de memória disponível para outros processos pode ser afetada por um grande número de zumbis. No entanto, se você tiver tantos zumbis, terá um problema grave com o aplicativo pai ou um bug no sistema operacional.
Então, o que você faz quando um procedimento se transforma em um zumbi? Você rastreia e elimina os processos zumbis.
Como encontrar um processo zumbi?
A parada inicial para matar um processo zumbi no sistema é primeiro identificá-lo. Como o processo init limpa regularmente os zumbis, tudo que você precisa fazer para se livrar deles é destruir o processo que os criou.
O comando top é uma maneira rápida de ver se há zumbis na sua área. Para conseguir isso, vamos executar o seguinte comando.
principal
O número de processos zumbis neste sistema será mostrado na saída. No nosso caso acima, temos 0 zumbis.
Usando o comando ps e canalizando-o para egrep, podemos obter uma lista deles. O sinalizador de estado para processos zumbis é “Z”, e às vezes você também verá “extinto”.
tuts @ fosslinux: ~ $ ps aux | egrep "Z | extinto"
Vamos analisar as várias seções deste comando.
Z na coluna STAT da saída identifica um processo zumbi.
[extinto] na última coluna (COMMAND) da saída também identifica um processo zumbi.
Idealmente, não é possível matar um processo de zumbi porque ele está morto. Em vez disso, notificamos o pai para tentar ler o status do processo do filho e, finalmente, limpá-lo da tabela do sistema. Para acionar este processo, enviamos um sinal SIGCHLD para o pai do processo. Identificar o ID do processo pai ou o que é chamado de PID envolve a execução do seguinte comando:
tuts @ fosslinux: ~ $ ps -o ppid =
Depois de obter o PID do Zumbi, use o comando SIGCHLD sinalizar para os processos pai previamente identificados.
tuts @ fosslinux: ~ $ kill -s SIGCHLD
Em alguns casos, isso não limpa o processo de zumbi. Isso nos chama a nos envolver no plano b ou c. O anterior envolve reiniciar o processo pai ou eliminar os processos pai. Por outro lado, os últimos casos envolvem fazer uma reinicialização do sistema, especialmente quando o processo Zombie pode causar uma interrupção ou um grande aumento devido ao processo Zombie.
Abaixo está o comando para matar o processo pai.
tuts @ fosslinux: ~ $ kill -9
No caso de um processo pai ser eliminado, por extensão, todos os processos filho do pai fornecido também são eliminados. No caso de um dos processos filho ser crítico em um determinado momento, você pode precisar adiar o assassinato até que seja seguro. Por outro lado, uma verificação rápida pode lhe dizer quanta memória ou poder de processamento os processos Zombie estão consumindo. Isso ajuda a determinar se a melhor opção é matar o processador pai para fazer uma reinicialização do sistema no ciclo seguinte de manutenção do sistema que já está agendada.
No Linux, como funcionam os estados dos processos?
Claro, o Linux deve manter o controle de todos os aplicativos e daemons em execução no seu computador. Manter a tabela de processos é uma das maneiras de fazer isso.
Esta é uma lista de estruturas de memória do kernel. Esta lista inclui uma entrada para cada processo que contém algumas informações sobre ele. Cada uma das estruturas da tabela de processos contém muito pouca informação.
Eles armazenam o ID do processo, algumas outras informações e um ponteiro para o bloco de controle do processo (PCB).
O PCB é onde o Linux armazena todas as informações de que precisa para pesquisar ou definir para cada processo. Conforme um processo é criado, ele é modificado, recebe o tempo de processamento e, em seguida, é destruído.
Existem mais de 95 campos no Linux PCB. É definido na estrutura da tarefa, que tem mais de 700 linhas. Os seguintes tipos de informações podem ser encontrados no PCB:
Os estados do processo são ilustrados abaixo
- Número do processo: o identificador distinto do sistema operacional.
- Contador de programa: Quando este processo tiver acesso novamente à CPU, o sistema utilizará este endereço para localizar a próxima instrução do processo a ser executado.
- Registradores: este procedimento usa uma lista de registros de CPU chamados registros. Acumuladores, registradores de índice e ponteiros de pilha podem ser incluídos na lista.
- Lista de arquivos abertos: os arquivos associados a este procedimento estão incluídos na lista de arquivos abertos.
- Informações de agendamento da CPU: usado para calcular com que frequência e por quanto tempo este processo recebe tempo de processamento da CPU.
O PCB deve registrar a prioridade do processo, ponteiros para as filas de agendamento e outros parâmetros de agendamento. - Informações de gerenciamento de memória: informações sobre a memória que este processo está usando, como os endereços inicial e final da memória do processo, bem como ponteiros para páginas de memória.
- Informações sobre o status de E / S: Quaisquer dispositivos que o processo usa como entradas ou saídas.
Qualquer um dos seguintes pode ser o “Estado do Processo”:
- R: Um processo em execução ou capaz de executar. Está funcionando, o que significa que está obtendo e executando ciclos de CPU.
Um procedimento que está pronto para ser executado está aguardando um slot de CPU. - S: O ato de dormir.
O processo está aguardando a conclusão de uma ação, como uma operação de entrada ou saída. Ou a disponibilidade de um recurso. - D: O procedimento está em um estado de sono ininterrupto. Ele está usando uma chamada de sistema de bloqueio, o que significa que não continuará até que as chamadas de sistema sejam concluídas. Ao contrário do estado de “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: Por ter o sinal SIGSTOP, o processo terminou (parou).
Ele só vai responder aos sinais SIGKILL ou SIGCONT, matando ou instruindo o processo para continuar. Quando você muda das tarefas do primeiro plano (fg) para o segundo plano (bg), isso acontece. - Z: significa Processo Zumbi. Quando um processo é concluído, ele simplesmente não desaparece. Em vez disso, ele libera qualquer memória que está usando no momento e sai da memória, mas sua entrada na tabela de processos e PCB permanecem.
Seu estado é definido como EXIT ZOMBIE, e seu processo pai é informado de que o processo infantil foi concluído por meio do sinal SIGCHLD.
Conclusão
A menos que façam parte de uma vasta horda, os zumbis não são tão prejudiciais. Alguns não são grande coisa, e uma reinicialização rápida irá eliminá-los. No entanto, há um ponto a considerar.
As arquiteturas Linux têm um número máximo de processos e, como resultado, um número máximo de números de ID de processo. Quando o número máximo de processos zumbis de um computador é alcançado, novos processos não podem ser iniciados.
Processos zumbis não são processos; eles são os restos de processos mortos que seu processo pai não limpou corretamente. No entanto, se você notar que um determinado aplicativo ou processo está constantemente gerando zumbis, você deve investigar mais a fundo.
Provavelmente, é apenas um programa mal escrito; nesse caso, talvez haja uma versão atualizada que limpa depois que seu filho é processado adequadamente.