No Linux, pelo menos,
kill -- -1
Enviará o sinal SIGTERM para cada processo que ele puder, exceto pelo processo de chamada (assim, o processo que executa o comando kill
, que pode ser o shell se kill
estiver embutido lá (geralmente é em shells POSIX) ou o processo executando um comando kill
autônomo) e o processo de pid 1.
Observe que ele faz parte da chamada de sistema kill()
, por isso é mais confiável do que usar comandos como pkill
ou killall
(ou o comando tradicional killall
às vezes encontrado como killall5
no Linux tradicionalmente usado para isso), que lista os processos em primeiro lugar e, em seguida, mata-os como aqueles que perderiam os processos que foram gerados nesse meio tempo.
Então, parece exatamente o que você quer.
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
Deve matar tudo menos o processo de identificação 1.
Você pode experimentá-lo executando:
unshare --mount-proc -mpf
Isso inicia um shell em um pid separado e o namespace de montagem (com um novo / proc (como usado por ps
/ pkill
/ killall
)) em que esse shell tem pid 1.
kill -- -1
deve funcionar em todos os sistemas ao eliminar a maioria dos processos, mas a lista de processos que estão isentos da execução pode variar de sistema para sistema.