Has ejecutado un programa o aplicación en Linux, y de repente deja de funcionar, o el rendimiento cae en picado. Al tratar de ejecutarlo de nuevo, ves que la ejecución anterior todavía no ha terminado correctamente, o hay múltiples ejecuciones de la misma aplicación sin terminar. ¿Cómo puedes matar el o los procesos de esa aplicación? Te explicamos cómo matar un proceso en Linux desde el terminal o línea de comandos.
Lo primero que necesitamos es identificar el proceso que quieres terminar, porque puede haber más de uno aunque no lo hayas visto. Y después debes terminar ese proceso, pero debes tener varias cosas en cuenta antes de hacerlo, porque hay muchas formas matar procesos con consecuencias diferentes.
Localizar el proceso a terminar
Hay varios comandos para localizar un proceso, dos de ellos son: top y ps. Top es un comando interactivo, que te muestra el listado de todos los procesos en ejecución en tiempo real, lo va actualizando, y te permite ordenarlos por diferentes métricas además de mostrarte otra información adicional.
Por ejemplo, en el listado anterior podríamos suponer que el servicio influxd ha dejado de funcionar correctamente y necesitamos terminarlo, ya que no responde a los procedimientos normales. En ese listado podemos extraer el identificador de proceso (PID) con el que podremos realizar varias acciones con él, en este caso es el 3823.
Top es un comando muy útil porque nos permite ordenar los procesos que más CPU o memoria están utilizando, y eso nos puede servir para buscar el proceso que buscamos. Pero en otras ocasiones ya sabemos como se llama el proceso, y lo único que necesitamos es buscar su identificador (PID), y para eso te mostramos un par de opciones.
La primera, el comando ps, que te muestra un listado de todos los procesos en ejecución en ese momento, uno por línea junto con mucha información adicional: PID, %CPU, %MEM, tiempo que lleva en ejecución, el nombre del comando completo que lo inició, … Esto utilizado junto con grep para filtrar la información que buscar, puede ser suficiente para identificarlo:
ps aux | grep influxd
Los tres parámetros utilizados significan:
- a = mostrar los procesos de todos los usuarios
- u = mostrar el usuario dueño de ese proceso
- x = mostrar también procesos no asociados a un terminal
Y tendrías como resultado algo como esto, ten en cuenta que también es probable que aparezca el comando grep que estás ejecutando en ese momento para la búsqueda:
Pero tienes una forma incluso más fácil de utilizar, con el comando pgrep. El comando pgrep es la unión de los dos anteriores, porque le pasas como argumento el nombre del proceso a buscar y te facilita directamente el PID de ese proceso:
Ahora que ya conoces varios métodos para identificar el proceso, vamos a ver cómo podemos finalizarlo.
Matar o finalizar un proceso en Linux
Ya disponemos los datos necesarios para acabar con el proceso en cuestión, el nombre de proceso y el PID. Y tenemos varios comandos para finalizar un proceso, en base a la información que le queramos facilitar:
- kill: mata un proceso pasándole el PID
- killall: mata procesos con un determinado nombre de proceso
- pkill: mata procesos pasándole un nombre de proceso
Pero, antes de continuar vamos a aclarar algo. Lo que llamamos habitualmente matar un proceso, o finalizar un proceso, no es más que enviar una determinada señal a ese proceso para que ejecute una determinada acción. Y esas acciones pueden ser que termine su ejecución, pero hay distintas formas de decírselo, para que termine más o menos correctamente. Las más habituales:
- SIGTERM (15): mata el proceso pero le permite finalizar correctamente
- SIGKILL (9): mata el proceso pero no le permite finalizar correctamente
- SIGSTOP (19): para el proceso (no lo mata)
- SIGCONT (18): continúa el proceso si estaba parado
- SIGINT (2): Interrupción de teclado (como si pulsaras CTRL+C)
Esto es solo una muestra, puedes ver todas las opciones con kill -l. Como ves hay diferencias entre las distintas opciones, por ejemplo las señales 15 pueden ser ignoradas por el proceso, pero las señales 9 y 19 no pueden ignorarse.
La recomendación general, es primero utilizar un SIGTERM para permitir que el proceso finalice correctamente, y si eso no funciona utilizar un SIGKILL:
kill -9 3823 (o kill -TERM 3823) kill -15 3823 (o kill -KILL 3823)
Recuerda que también podrías hacerlo así:
killall -9 influxd pkill -15 influxd
En cada una de estas opciones, hay muchas variantes y posibles filtros: buscar solo los procesos de un determinado usuario, que coinciden con una determinada sesión, o los más antiguos/nuevos. Si necesitas ampliar estas opciones consulta la página de manual.
Conclusiones
Ten en cuenta que terminar procesos es delicado, porque un simple error puede llevarte a matar el proceso que no quieres y provocar algún problema en tu sistema, o en algún servicio, así que hazlo con cuidado y asegúrate de que terminas el proceso que necesitas.
Tienes varias opciones para identificar y matar el proceso, así que pruébalas todas y escoge la que más te guste, o que mejor te venga en cada momento. Si ya conoces los procesos top y ps, y conoces sus ventajas, familiarízate con pgrep y pkill porque son más cómodos y rápidos de utilizar.