
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
.
awk
se 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 256
que 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 kill
comando, que podría ser el shell, si kill
está integrado allí (generalmente está en shells POSIX) o el proceso que ejecuta un kill
comando 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 pkill
o killall
(o el killall
comando tradicional que a veces se encuentra killall5
en 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 -- -1
deberí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:
init
ignora SIGTERM en Linux, explícitamente. Así que simplemente podrías hacerlo killall -TERM '*'
.