kill: Matando todos los procesos de GNU/Linux con un comando

Publicado por Diego Córdoba en

Podemos apagar el Linux usando un solo comando? Es seguro usar «sudo kill -9 -1»? Qué alternativas tenemos? Aquí todo el detalle y la doc 🙂

En sistemas Linux, el comando kill permite enviar señales a los procesos.

De manera predeterminada, la señal que se envía es la de terminación normal del proceso, o TERM (SIGTERM). Es decir, el proceso, al recibir la señal, intentará liberar los recursos que está utilizando, liberar memoria, buffers, cerrar descriptores de archivos, etc.

En mis clases suelo mencionar que esta señal es como si le pidiéramos al proceso por favor que termine.

En algunos casos, el proceso no llega a terminar debido principalmente a problemas internos, por lo que los administradores solemos utilizar la señal 9 (KILL, SIGKILL). Enviar esta señal a un proceso ya no es pedirle que termine, sino más abrupto, algo como «dispararle en la nuca«, forzar su detención.

Igual, tema que podemos ampliar más adelante, puede ocurrir que algunos procesos de bajo nivel no terminen ni siquiera así, debido a errores en su ejecución, y debamos reiniciar el sistema operativo.

¿Es conveniente usar la señal KILL siempre?

No, solamente debe utilizarse cuando no quede otra opción. Se trata de una señal no ignorable, y el proceso no puede cambiar su comportamiento al recibirla. El núcleo la interpreta como «termina YA el proceso«.

Linux usa buffers y cache para optimizar su funcionamiento y el acceso a disco. Al apagar un proceso normalmente, éste vuelca sus datos en buffers y cache dentro del almacenamiento persistente, y termina.

El kernel libera la memoria del proceso y los recursos asignados, pero es algo que hace el sistema operativo, no el proceso en si. Es decir.

  • El proceso no ejecuta su código de limpieza.
  • El proceso no guarda datos de buffers o cache en disco (pueden perderse).
  • El proceso no cierra conexiones de manera ordenada.
  • El proceso no libera locks de archivo, ni bases de datos, de forma segura.

Todas estas tareas sí las ejecuta el proceso cuando le «pedimos que termine» con SIGTERM (15).

En fin, con SIGTERM le pedimos al proceso que termine, y con SIGKILL forzamos a que el kernel termine el proceso.

Por esto es que no es conveniente usar SIGKILL salvo que la situación lo requiera, por ejemplo, el proceso no responde y no hay otra forma de terminarlo.

¿Y si usamos el PID -1 en el comando kill?

El comando kill, además de las opciones que le permiten especificar la señal, recibe argumentos.

El argumento puede ser:

  • El PID de un proceso, con lo cual kill enviará la señal especificada al proceso en cuestión.
  • 0, para enviarle la señal a todos los procesos del grupo actual de procesos del sistema.
  • -n, donde n es un grupo de procesos, cuyo número debe ser mayor a 1. En esta caso se enviará la señal a todos los procesos de un grupo determinado.
  • -1: En este caso, kill enviará la señal a todos los procesos del sistema cuyo PID sea mayor que 1.

Con los privilegios adecuados, esta última opción puede hacer cosas malas 😛

Recordemos que el PID 1 en general es el PID del proceso init o systemd, un proceso protegido por Linux.

kill man page

¿Y si apago el sistema con sudo kill -9 -1?

Este comando enviará la señal KILL (9) a todos los procesos del sistema cuyo PID sea mayor que 1 (-1), usando privilegios de root (sudo).

Esto provocará que el núcleo mate a todos los procesos del sistema, excepto al proceso init o systemd, cuyo PID suele ser 1.

La sesión de usuario se cerrará de golpe, de manera abrupta, se caigan los servicios del sistema, y todo el sistema operativo quede inutilizable. La única solución aquí (creo que) es reiniciar el ordenador.

Apagar el sistema usando este comando puede ser destructivo para los datos, podemos llegar a perder datos que no hayan sido guardados correctamente en almacenamiento persistente, ya que los procesos no podrán escribir en disco sus buffers y ni datos de cache, y el sistema no podrá realizar la sincronización de memoria en disco (sync).

Esto ocasionaría pérdidas y corrupción de archivos, por lo que no es seguro apagar el sistema usando este comando, hay otras alternativas mejores.

Alternativas mejores que kill

Existen otros comandos, como shutdown, systemctl poweroff, o incluso halt, que:

  • Notifican a procesos, mediante SIGTERM, que terminen normalmente.
  • Sincronizan los datos del sistema de archivos (sync).
  • Desmontan los sistemas de archivos (umount).
  • Apagan el hardware.

Esto reduce el riesgo de pérdida de datos y mantienen la consistencia del sistema operativo.

NOTA: para los que quieran más precisión, no, los comandos anteriores no hacen exactamente lo mismo, si quieren podemos extendernos en otro artículo. Por el momento, los invito a pasar por las páginas de manual de halt y de systemctl, ahí se explican las diferencias entre los diferentes comandos, y algunas opciones que pueden cambiar los comportamientos predeterminados.

Conclusión

En fin, usar sudo kill -9 -1 para apagar el sistema es casi como desenchufarlo de la pared (y hasta más rápido, porque no tenemos ni siquiera que tirar del cable xD).

Siempre que se pueda, debemos usar otros comandos, o accesos a ellos mediante la interfaz gráfica, y dejar el sudo kill -9 -1 solamente para pruebas controladas.

Se me ocurre que podríamos usarlo también para simular de fallo masivo del sistema, por ejemplo, si estamos trabajando con un cluster de bases de datos replicadas, apagar un nodo podría ayudarnos a ve si la sincronización está funcionando. Otra que se me ocurre es verificar si luego del apagado abrupto los daemons vuelven a iniciar automáticamente al iniciar el sistema.

También podría usarse para verificar si los sistemas de archivos con journaling están recuperándose correctamente de un apagón.

O, yendo más a lo humano, para entrenar a grupos de sysadmins y devops para apagar servicios críticos y levantar réplicas para volver a estar online.

En fin, podría decirse que tiene algunas utilidades, pero apagar el sistema no es una de ellas 🙂

Espero que les sirva!

Hasta la próxima!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: Linux

Diego Córdoba

- Ingeniero en Informática - Mgtr. Teleinformática - Instructor GNU/Linux, Programación, Redes TCP/IP, criptografía y ciberseguridad. - (Ex) Docente universitario e investigador