
Quero eliminar todos os processos em um sistema, exceto o PID 1.
Atualmente estou usando pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT
.
awk
é usado para excluir o processo com PID 1
Se eu executar o comando no Alpine Linux (que usa sh
), recebo:
# pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT
kill: can't kill pid 265: No such process
Acredito PID 256
que seja de awk
.
Existe uma maneira limpa (usando utilitários que deveriam estar disponíveis na maioria dos sistemas Linux) de eliminar todos os processos, exceto o PID 1
?
Responder1
Pelo menos no Linux,
kill -- -1
Enviará o sinal SIGTERM para todos os processos que puder, exceto para o processo de chamada (portanto, o processo que executa esse kill
comando que pode ser o shell se kill
estiver embutido nele (geralmente está em shells POSIX) ou o processo que executa um kill
comando independente) e o processo de pid 1.
Observe que ele faz isso como parte da kill()
chamada do sistema, por isso é mais confiável do que usar comandos como pkill
ou killall
(ou o killall
comando tradicional às vezes encontrado killall5
no Linux tradicionalmente usado para isso) que primeiro lista os processos e depois os mata, pois eles perderiam o processos que foram gerados nesse meio tempo.
Então parece exatamente o que você deseja.
trap '' TERM # ignore SIGTERM ourselves though it wouldn't be needed
# in most shells
kill -- -1
sleep 1 # leave processes some time to exit cleanly on SIGTERM
kill -s KILL -- -1 # removes the remaining processes or those
# that have started since without giving them
# a chance to clean-up.
exit
Deveria matar tudo menos o processo do id 1.
Você pode experimentar executando:
unshare --mount-proc -mpf
Isso inicia um shell em um namespace pid e mount separado (com um novo /proc (conforme usado por ps
/ pkill
/ killall
)) onde esse shell possui pid 1.
Fora do Linux, kill -- -1
deve funcionar em todos os sistemas para eliminar a maioria dos processos, mas a lista de processos isentos da eliminação pode variar de sistema para sistema.
Responder2
Podevocê? Sim. Devevocê? em quase todas as circunstâncias, não. Mas:
init
ignora SIGTERM no Linux, explicitamente. Então você poderia simplesmente fazer killall -TERM '*'
.