¿Cómo elimino todos los procesos excepto el PID 1?

¿Cómo elimino todos los procesos excepto el PID 1?

Quiero eliminar todos los procesos de un sistema excepto el PID 1.

Actualmente estoy usando pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT.

awkse utiliza para excluir el proceso con PID 1

Si ejecuto el comando en Alpine Linux (que usa sh), obtengo:

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

Creo PID 256que es de awk.

¿Existe una forma limpia (utilizando utilidades que deberían estar disponibles en la mayoría de los sistemas Linux) para eliminar todos los procesos excepto PID 1?

Respuesta1

Al menos en Linux,

kill -- -1

Enviará la señal SIGTERM a todos los procesos que pueda, excepto al proceso de llamada (por lo que el proceso que ejecuta ese killcomando, que podría ser el shell, si killestá integrado allí (generalmente está en shells POSIX) o el proceso que ejecuta un killcomando independiente) y el proceso de pid 1.

Tenga en cuenta que lo hace como parte de la kill()llamada al sistema, por lo que es más confiable que usar comandos como pkillo killall(o el killallcomando tradicional que a veces se encuentra killall5en Linux y que se usa tradicionalmente para eso) que primero enumera los procesos y luego los elimina, ya que perderían el procesos que se han generado mientras tanto.

Entonces suena exactamente lo que quieres.

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

Debería eliminar todo menos el proceso de id 1.

Puedes experimentar con él ejecutando:

unshare --mount-proc -mpf

Eso inicia un shell en un espacio de nombres de montaje y pid separado (con un nuevo /proc (como lo usa ps// pkill) killall) donde ese shell tiene pid 1.

Fuera de Linux, kill -- -1debería funcionar en todos los sistemas para eliminar la mayoría de los procesos, pero la lista de procesos que están exentos de la eliminación puede variar de un sistema a otro.

Respuesta2

Poder¿tú? Sí. Debería¿tú? En casi todas las circunstancias, no. Pero:

initignora SIGTERM en Linux, explícitamente. Así que simplemente podrías hacerlo killall -TERM '*'.

información relacionada