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

5

Eu quero matar todos os processos em um sistema, exceto o PID 1.

No momento, estou usando pgrep -l . | awk "{if (\ != 1) print \}" | xargs -n 1 kill -s INT .

awk é usado para excluir o processo com PID 1

Se eu executar o comando no linux alpino (que usa sh ), obtenho:

# pgrep -l . | awk "{if (\ != 1) print \}" | xargs -n 1 kill -s INT
kill: can't kill pid 265: No such process

Eu acredito que PID 256 é de awk .

Existe uma maneira limpa (usando utilitários que devem estar disponíveis na maioria dos sistemas Linux) para eliminar todos os processos, exceto PID 1 ?

    
por F21 17.05.2016 / 07:08

2 respostas

6

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.

Fora do Linux, 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.

    
por 17.05.2016 / 09:05
0

Pode você? Sim. Deve você? sob quase todas as circunstâncias, não. Mas:

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

    
por 17.05.2016 / 08:22

Tags