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.
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}')