Matar proceso en Linux desde la consola
Tanto si somos usuarios novatos como avanzados, tarde o temprano nos encontraremos con algún programa o proceso rebelde al que tendremos que poner fin por la fuerza. En Windows estamos acostumbrados usar el administrador de tareas para terminar procesos. Hoy nos vamos a centrar en como matar un proceso en Linux, para lo que usaremos la consola.
La terminal es una herramienta polivalente en entornos Gnu/Linux y no debemos tacharla de complicada, tan sólo necesitamos un poco de práctica. Matar un proceso manulamente es algo muy habitual y no tiene por qué ser algo peligroso si lo hacemos correctamente. Aunque debemos tener presente que si matamos procesos de los que depende el buen funcionamiento del sistema operativo, esto puede tener consecuencias inesperadas u originar un fallo crítico.
Conociendo los procesos y como se identifican con el PID.
Un proceso en Linux no es más que un programa que está en ejecución y al que se le ha asignado un identificador que se conoce como PID. El PID es una abreviatura de Process ID, que hace referencia al identificador de proceso. Cada proceso tendrá un PID único.
Para obtener una lista detalla de todos los procesos, podemos ejecutar en la terminal el comando ps aux
. Dentro de la lista de procesos, veremos que una de las columnas se corresponde con el PID, el cual es un valor numérico entero.
No voy a explicar con detalle el significado de cada columna, pero sí que voy a recordaros que podéis enlazar el comando anterior con grep
para buscar rápidamente algún proceso. Por ejemplo, podemos usar ps aux | grep apache
para localizar la información del proceso del servidor Apache.
Procesos padre y procesos hijo en Linux.
También debemos tener presente que los procesos pueden ejecutar otros procesos, llamados procesos hijos. Los procesos hijos tiene su propio PID, pero al mismo tiempo se les asigna el identificador PPID (Parent Process Identificator), que nos indica el PID del proceso padre.
Teniendo en cuenta todo lo dicho sobre procesos padre y procesos hijo, también debemos conocer el comando ps -ef
que nos muestra los valores de PPID.
Comandos y herramientas para matar procesos en Linux.
Vamos a empezar hablando del comando kill, que suele ser el más habitual a la hora de detener procesos. El comando kill
puede tomar como argumento la señal que enviará al proceso para matar, detener, reanudar o suspenderlo. El nombre de estas señales con su valor numérico correspondiente son las siguientes:
- SIGINT – 2: esta señal interrumpe un proceso, equivale a pulsar la combinación de teclas
Ctrl + C
. - SIGKILL – 9: mata un proceso de forma definitiva (no se puede recuperar).
- SIGTERM – 15: interrumpe un proceso al igual SIGINT, pero esta señal puede ser interpretada por el proceso. Cuando empleamos el comando kill sin especificar ninguna señal, esta es la que se usa por defecto.
- SIGCOUNT – 18: reanuda un proceso que ha sido detenido.
- SIGSTOP – 19: detiene un proceso, equivale a pulsar la combinación de teclas
Ctrl + Z
.
Las anteriores son las señales más habituales, pero puedes consultar la lista completa con el comando kill -l
.
Si lo que queremos es matar un proceso de forma inmediata, el comando sería kill -9 PID
o su equivalente kill -SIGKILL PID
. Usa el que te sea más fácil de recordar.
Matar procesos conociendo su nombre con los comandos pkill y killall.
Si conocemos el nombre del proceso en lugar de su PID, podemos usar el comando pkill
o el comando killall
. Estos dos comandos son similares, pero no iguales.
Siguiendo con el ejemplo anterior, podríamos matar un proceso con pkill de la siguiente forma: pkill -9 nombreproceso
.
Del mismo modo, es aplicable para el comando killall con el siguiente ejemplo: killall -9 nombreproceso
.
Aquí nos puede surgir la pregunta de qué pasa cuando hay varios procesos que tienen el mismo nombre y se ejecuta uno de estos comandos. La respuesta es sencilla, este comando actúa sobre todo los procesos que tengan el nombre especificado.
Diferencias entre pkill y killall.
El comando pkill emplea un patrón para buscar la coincidencia del nombre de proceso, mientras que killall busca la coincidencia exacta. Para entender esto mejor, si tenemos un proceso cuyo nombre es apache2
y empleamos el comando pkill -9 apache
, mataremos el proceso apache2. Si empleamos el comando killall -9 apache
, el proceso apache2 no se detendrá (porque killall necesita el nombre exacto del proceso).
Otras herramientas, referencias y palabras finales.
Espero que este tutorial te haya servido de ayuda y ahora conozcas un poco más de cerca las posibilidades que nos ofrece la consola en Linux.
Debo recordarte que en el blog ya hablamos con anterioridad de la herramienta fkill-cli, que permite matar procesos de forma interactiva. Existe otra herramienta muy similar pero escrita con el lenguaje Go, cuyo nombre es Gkill.
También me gustaría aprovechar la ocasión para hacer referencia a un artículo del foro en el que se habla sobre cómo detener los stopped jobs (procesos zombi en segundo plano).