Como faço para matar todos os processos, exceto o PID 1?

Como faço para matar todos os processos, exceto o PID 1?

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 256que 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 killcomando que pode ser o shell se killestiver embutido nele (geralmente está em shells POSIX) ou o processo que executa um killcomando 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 pkillou killall(ou o killallcomando tradicional às vezes encontrado killall5no 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 -- -1deve 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:

initignora SIGTERM no Linux, explicitamente. Então você poderia simplesmente fazer killall -TERM '*'.

informação relacionada