2.10.- Destruir procesos

A veces, no basta con reducir la prioridad de un proceso. Podemos encontrarnos que un programa deje de responder totalmente o puede que desee finalizar un proceso que no debería estar en ejecución. Para estos casos tenemos el comando kill. Esta herramienta envia una señal (un método que Linux utiliza para comunicarse con los procesos) a un proceso. La señal la suele enviar el kernel, el usuario o el propio programa para finalizar el proceso. Linux admite muchas señales numeradas, asociada cada una a un nombre específico. Podemos verlas todas escribiendo kill -l.

kill_l

Si no empleamos -l, la sintaxis para kill será la siguiente:

kill -s señal pid

Nota_destruir

El parámetro -s signal envia una señal especificada al proceso. Puede especificar la señal especificando un número o un nombre (como SIGKILL). Las señales que es más probable que utilice son:

  • 1 (SIGHUP).- Finaliza los programas interactivos y hace que muchos demonios vuelvan a leer sus ficheros de configuración.
  • 9 (SIGKILL).- Hace que el proceso termine sin realizar las tareas de finalización de rutinas.
  • 15 (SIGTERM).- Hace que el proceso termine pero permite cerrar los ficheros abiertos.

Si no especifica una señal, el valor por defecto es el 15 (SIGTERM). Tambien podemos usar su forma abreviada -señal. Si hace esto y emplea un nombre de señal, debería omitir la parte SIG del nombre (por ejemplo, utilice KILL en lugar de SIGKILL). La opción pid es, obviamente, la PID del proceso que desea destruir. Puede obtener este número de ps o top.

Debemos tener en cuenta que el comando kill sólo destruirá aquellos procesos que pertenezcan al usuario que lo ejecuta. La excepción es que si ese usuario es root, el superusuario destruirá todos los procesos de los usuarios.

El kernel puede estar pasándoles señales a los programas aunque no utilice el comando kill. Por ejemplo, cuando abandona una sesión, a los programas que inició  desde ésta se les envia la señal SIGHUP, que hace que terminen. Si desea ejecutar un programa que siga ejecutándose a pesar de que se cierre la sesión, para iniciarlo con el programa nohup.

$> nohup programa opciones

Este comando hace que el programa ignore la señal SIGHUP. Puede serle útil si desea iniciar determinados servidores pequeños que pueden ser ejecutados legítimamente por usuarios normales.

 Una variante de kill es killall, que tiene la siguiente forma:

killall [opciones] [--] nombre [...]

killall_1

Este comando destruye un proceso en base a su nombre, en lugar de su número de PID.

killall_2Podemos especificar una señal de manera abreviada (-señal) o anteponiendo -s o --signal a ésta. Al igual que con el programa kill, el valor por defecto es 15 (SIGTERM). Una opción de killall muy importante es -i, que hace que se le pida a confirmación antes de enviar la señal a cada proceso.

killall_3

En este ejemplo, aparece una instancia del editor gedit en ejecución.

killall_4Aquí aparecen dos instancias del editor gedit ejecutándose, pero sólo destruiremos una. Como norma general, si ejecuta killall como root, debe utilizar el parámetro -i; si no lo hace, es demasiado probable que se destruya procesos que no debería, especialmente si el ordenador lo utiliza más de una persona a la vez.

killall_advertencia