Halloween no Linux: como matar processos zumbis

selo de halloween

O dia dos mortos está chegando e é por isso que queremos fazer este pequeno tutorial da LxA para falar sobre o processos zumbis e como podemos matá-los. A primeira coisa a dizer é o que é o processo zumbi, e isso é que como você sabe, o kernel do Linux possui um subsistema para gerenciar os processos e trabalha com o planejador para criar, variar a prioridade, enviar ou remover o fluxo de processamento da CPU e processos de eliminação. Bem, esta parte do kernel, como o resto dos sistemas do tipo Unix, distingue entre vários estados de processos ...

Então, podemos encontrar isso um processo pode estar no estado adormecido (S), ou seja, adormecido. Também processos em estado de execução (R) que são aqueles que estão atualmente em execução ou em execução, processos em espera (D) que estão parados esperando para serem atendidos, gestpt (T) ou suspensos, e também os zumbis (Z) ou mortos. Um processo zumbi ou morto é aquele que já foi encerrado com sucesso, mas tem certos recursos do sistema sequestrados, pois o Linux ainda está salvando-o na tabela de processos. Você já sabe que quando um processo termina, ele não deve ficar neste estado, mas se completa e o kernel libera os recursos para que outros processos possam utilizá-los, basicamente libera a RAM ocupada ...

Bem, como não é interessante ter este tipo de processos zumbis, embora não sejam tão frequentes, podemos procurá-los e eliminá-los conforme indicado aqui. A primeira coisa é descobrir se existem processos zumbis em nossa distro e para isso podemos nos ajudar ferramentas como top ou como ps. Por exemplo, uma destas duas opções:

ps -el | grep 'Z'

ps aux | grep defunct

E uma vez detectados, podemos Mate ele diretamente com:

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

Embora outra alternativa seja encontrar os processos pai, pois para matar um processo de zumbi Você tem que matar os processos pais que o sustentam, como você pode ter deduzido:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Você terá que substituir pelo ID do processo zumbi que você encontrou e para matá-lo com kill, use o ID do processo pai substituindo no exemplo, obviamente.


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: AB Internet Networks 2008 SL
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   bolas feitas dito

    Bom site!
    Eles sempre nos livram de problemas.

    Onde diz:
    Embora outra alternativa seja encontrar os processos pai, já que para matar um processo zumbi, você deve matar os processos pai que o suportam, como você pode ter deduzido:

    1 ps -eo pid, ppid | grep
    2|
    3 | matar -9

    Você terá que substituir o ID do processo zumbi que você encontrou e para matá-lo com kill, use o ID do processo pai substituindo no exemplo, obviamente.

    você pode adicionar o script:

    $ gato killppid.sh
    #! / Bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Obviamente, não é uma tarefa que um usuário normal executa o tempo todo.
    Só seria útil para o administrador, mas é perigoso executá-lo como root, pois pode matar qualquer processo do sistema.

    No homem matar tem esta nota:

    NOTAS Seu shell (interpretador de linha de comando) pode ter um comando kill embutido. Você pode
    precisa executar o comando descrito aqui como / bin / kill para resolver o conflito.

    O Bash tem esse comando, essa é a parte do man bash sobre isso:

    matar [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
    kill -l | -L [sigspec | exit_status]
    Envie o sinal nomeado por sigspec ou signum para os processos nomeados por pid ou job
    spec. sigspec é um nome de sinal que não diferencia maiúsculas de minúsculas, como SIGKILL (com ou
    sem o prefixo SIG) ou um número de sinal; signum é um número de sinal. Se
    sigspec não está presente, então SIGTERM é assumido. Um argumento de -l lista o
    nomes de sinais. Se algum argumento for fornecido quando -l for fornecido, os nomes dos
    sinais correspondentes aos argumentos são listados e o status de retorno é 0.
    O argumento exit_status para -l é um número que especifica um número de sinal ou
    o status de saída de um processo encerrado por um sinal. A opção -L é equivalente
    emprestado a -l. kill retorna verdadeiro se pelo menos um sinal foi enviado com sucesso, ou
    false se ocorrer um erro ou uma opção inválida for encontrada.

    No início eles explicam como o bash protege os processos, para evitar alguns problemas, mas não está claro para mim como eu poderia fazer um script seguro rodar como root.
    A única coisa que consigo pensar é em protegê-lo assim:

    $ gato killppid.sh
    #! / Bin / bash
    se [$ USER == "root"]
    then echo Não execute $ 0 como root !!! é perigoso!
    saída
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Use bash's kill, não / bin / kill

    Como você pode ver que não sou muito versado em bash.
    Você sabe como escrever um script seguro que seja executado como o usuário do processo filho, mesmo que seja executado como root?
    algo equivalente ao que seria feito manualmente como este:

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')