Programas que são mal escritos ou realizando mal podem sair processos zumbis espreitando dentro do seu computador Linux. Descubra como os zumbis são criados e como você pode finalmente colocá-los para descansar.
Como os estados do processo trabalham no Linux
O Linux, claro, tem que acompanhar todos os aplicativos e daemons em execução no seu computador. Uma das maneiras que faz isso é mantendo a tabela de processos. Esta é uma lista de estruturas na memória do kernel. Cada processo tem uma entrada nesta lista que contém algumas informações sobre isso.
Não há muito em cada uma das estruturas de mesa de processo. Eles seguram o ID do processo , alguns outros itens de dados e um ponteiro para o bloco de controle de processo (PCB) para esse processo.
É o PCB que detém os muitos detalhes que o Linux precisa procurar ou definir para cada processo. O PCB também é atualizado como um processo é criado, dado tempo de processamento e, finalmente, destruído.
O PCB do Linux contém mais de 95 campos.
É definido
Como uma estrutura chamada
task_struct.h.
e são mais de 700 linhas. O PCB contém os seguintes tipos de informações:
- Estado do processo : Os estados são descritos abaixo.
- Número do processo : Seu identificador exclusivo dentro do sistema operacional.
- Contador de programas : Quando este processo é o próximo acesso à CPU, o sistema usará esse endereço para encontrar a próxima instrução do processo que deve ser executada.
- Registros : A lista de registros de CPU usados por este processo. A lista pode conter acumuladores, registros de índice e ponteiros de pilha.
- Abra a lista de arquivos : 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 este processo. A prioridade do processo, ponteiros para agendar filas, e outros parâmetros de agendamento devem ser gravados no PCB.
- Informações de gerenciamento de memória : Detalhes sobre a memória Este processo está usando, como os endereços de início e término da memória do processo e ponteiros para as páginas de memória.
- Informações de status de E / S : Quaisquer dispositivos de entrada ou saída usados pelo processo.
O "estado do processo" pode ser qualquer um dos seguintes:
- R: Um processo de corrida ou runnable. Correndo o que significa que está recebendo ciclos de CPU e execução. Um processo de runnable está pronto para executar e aguardar um slot da CPU.
- S: Um processo de dormir. O processo aguarda uma ação para concluir, como uma operação de entrada ou saída, ou para um recurso para se tornar disponível.
- D: O processo está em um estado de sono ininterrupto. Está usando uma chamada de sistema de bloqueio e não pode continuar até que as chamadas do sistema tenham sido concluídas. Ao contrário do estado "Sleep", um processo nesse estado não responderá aos sinais até que a chamada do sistema seja concluída e a execução tenha retornado ao processo.
-
T:
O processo terminou (parado) porque recebeu o
Sigstop.sinal. Isto só responderá aoSigkill.ouSigcont.sinais, que matam o processo ou o instruem a continuar, respectivamente. Isso é o que está acontecendo quando você troca de primeiro plano (fg.) para fundo (bg)tarefas. -
Z:
Um processo zumbi. Quando um processo é concluído, isso não desaparece. Ele libera qualquer memória que está usando e remove-se da memória, mas sua entrada na tabela de processos e PCB permanecem. Seu estado é definido para
Exit_zombie., e seu processo pai é notificado (peloSigchld.sinal) que o processo infantil terminou.
No estado zumbi, o processo pai chama um dos
esperar()
Famílias de funções
quando o processo filho é criado. Em seguida, espera uma mudança de estado no processo filho. O processo filho foi parado, continuado ou morto por um sinal? Tem terminado correndo através da conclusão natural do seu código?
Se a mudança de estado é uma que significa que o processo filho parou de funcionar, seu código de saída é 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 processos no estado zumbi não existem há muito tempo.
RELACIONADO: Como executar e controlar processos de fundo no Linux
O que causa processos de zumbis no Linux?
Um processo pai mal escrito pode não chamar o
esperar()
função quando o processo filho é criado. Isso significa que nada está assistindo às mudanças de estado no processo filho, e
Sigchld.
sinal será ignorado. Ou talvez outra aplicação esteja afetando a execução do processo pai, seja devido a má programação ou intenção maliciosa.
No entanto, se o processo pai não estiver assistindo às alterações de estado no processo filho, a limpeza do sistema adequada não ocorrerá. O PCB e a entrada na tabela de processos não serão removidos quando o processo filho terminar. Isso resulta no estado zumbi nunca sendo 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 quaisquer problemas porque o PCB é muito maior que a entrada da tabela de processo.
Um grande número de zumbis poderia, concebivelmente, afetar a quantidade de memória gratuita para outros processos. Se você tem muitos zumbis, no entanto, você tem um problema sério com o aplicativo pai ou um bug do sistema operacional.
Como remover processos de zumbis
Você não pode matar um processo de zumbis porque já está morto. Não responderá a nenhum sinal porque foi removido da memória - não há lugar para enviar um
Sigkill.
sinal. Você pode tentar enviar o
Sigchld.
Sinal para o processo pai, mas se não funcionar quando o processo filho terminou, é improvável que também funcione agora.
A única solução confiável é matar o processo pai. Quando é rescindido, seus processos infantis são herdados pelo
iniciar
Processo, que é o primeiro processo a ser executado em um sistema Linux (seu ID de processo é 1).
o
iniciar
O processo realiza regularmente a limpeza necessária dos zumbis, por assim dizer, você só tem que matar o processo que os criou. o
principal
O comando é uma maneira conveniente de ver se você tem algum zumbis.
Digite o seguinte:
Top
Este sistema tem oito processos zumbis. Nós
pode listar isso
usando o.
PS
comando
e canalizando-o em
egrrep
. Mais uma vez, os processos de zumbis têm uma bandeira do estado de "Z", e você geralmente também verá "extinta".
Digite o seguinte:
PS AUX | egrep "z | defunto"
Os processos zumbis estão listados.
Esta é uma maneira mais neal de descobrir os IDs do processo de zumbis do que rolagem para frente e para trás através
principal
. 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. Nós podemos fazê-lo usando
novamente. Vamos usar a opção de saída (
PS
-o.
) contar
PS
Para exibir apenas o ID do processo do pai e passá-lo com o
ppid =.
bandeira.
O processo que queremos encontrar será indicado usando o
-p.
opção (processo) e, em seguida, passando no ID do processo do zumbi.
Portanto, digamos o seguinte comando para procurar as informações do processo para o processo 7641, mas apenas relatará o ID do processo pai:
PS -O ppid = -P 7641
Somos informados que o ID do processo pai é 7636. Agora podemos referência cruzada, usando
PS
mais uma vez.
Nós vemos isso corresponde ao nome do processo pai de anterior. Para matar o processo pai, use a opção Sigkill com o comando Kill da seguinte forma:
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 estejam em uma horda maciça. Alguns não são nada para se preocupar e uma reinicialização simples irá limpá-las.
No entanto, se você perceber que um aplicativo ou processo está sempre desovando zumbis, é algo que você deve investigar. É mais provável que seja apenas um programa escrito desleixado, caso em que, talvez haja uma versão atualizada que limpa adequadamente após seus processos filhos.