Dominar la terminación de procesos de Linux con ps, pgrep, pkill y más

Administrar procesos en Linux puede parecer desalentador para un nuevo administrador de sistemas (sysadmin) al principio. Pero con un poco de explicación y demostración, aprenderá cómo encontrar y realizar la terminación de procesos en Linux es solo cuestión de usar herramientas de línea de comandos como ps y kill.

En este artículo, aprenderás comandos para localizar procesos en ejecución y erróneos, terminar procesos en ejecución, encontrar procesos en segundo plano y mucho más en cualquier sistema operativo Linux.

Al final del artículo, estarás administrando procesos basados en números de identificación de proceso (PIDs) desde la línea de comandos como un profesional de Linux. Sigue leyendo para aprender todo sobre los comandos de administración de procesos en Linux!

Prerrequisitos

Este artículo será un recorrido sobre cómo administrar procesos en Linux. Si quieres participar, necesitarás lo siguiente:

  • A Linux host, which can be a virtual machine or a physical machine.
  • Para probar los ejemplos de PowerShell, instala PowerShell 7.1.1 en un host Linux.
  • A non-root user account. While root access is not required, there will be an example where the root user can kill the running process of another user.

La distribución de Linux que elijas usar es decisión tuya. Este artículo se basará en Ubuntu 20.04 LTS. Sin embargo, los comandos son estándar para el sistema operativo Linux.

¿Listo para empezar? Bien, ¡vamos a sumergirnos!

Administración de procesos en Linux

En ocasiones, es posible que te encuentres en una situación en la que necesites detener un proceso en ejecución en un sistema Linux. Por ejemplo, puede que tengas un script de bash que se ejecuta según una programación. Ese script de bash está configurado para ejecutarse como otro usuario a través de un trabajo de cron (programador de procesos de Linux).

A veces, este script genera procesos erróneos que pueden hacer que el script falle. ¿Cómo puedes matar esos procesos erróneos sin reiniciar el sistema o detener el script?

En las siguientes secciones, aprenderás sobre los comandos utilizados para localizar y terminar o matar procesos en un sistema Linux. Cada sección se basará en la anterior. Aprenderás sobre los comandos ps, top, pgrep, kill y pkill, todos nativos de Linux.

Como bonificación, se incluyen los comandos equivalentes en PowerShell Get-Process y Stop-Process si no te gusta usar comandos nativos de Linux.

Herramientas para localizar procesos

Antes de matar un proceso, debes localizar el proceso correcto. El PID único permite un objetivo preciso. Sigue leyendo para aprender cómo localizar los procesos correctos para terminarlos.

Usando el comando ps para mostrar información de los procesos.

El comando ps o Estado del Proceso muestra información relacionada con los procesos activos en un sistema Linux. Puedes ubicar un proceso en ejecución e incluso procesos en segundo plano con ps.

El comando ps mostrará, por defecto, todos los procesos para la identificación efectiva del usuario (EUID) del usuario actual. Ejecutar el comando ps, como se muestra a continuación, devolverá todos los procesos en ejecución que tu usuario puede terminar.

ps
Displaying processes matching the EUID (effective user ID) for the user bkindle.

Encontrar información detallada del proceso usando el comando top

¿Qué pasa si quieres encontrar información constantemente actualizada sobre los procesos en ejecución y las métricas del sistema? En ese caso, puedes usar el comando top. A diferencia de ps, el comando top actualiza la información de los procesos en la pantalla en un intervalo establecido.

Cuando ejecutas el comando top, verás más que solo un PID. Junto con los detalles del proceso, se incluyen porcentajes de CPU y memoria, valores Nice (prioridad de programación de CPU), y la prioridad del proceso (PR) establecida por el kernel de Linux.

Para un administrador de sistemas nuevo o experimentado, el comando top suele ser la herramienta principal para gestionar recursos y procesos vitales del sistema. Como se muestra a continuación, la salida del comando top muestra más información de los procesos que el comando ps, incluyendo métricas generales del sistema.

The top command on Ubuntu Desktop 20.04 LTS showing all running PID’s.

htop es una variante mejorada de top que incluye varias mejoras, como una salida de terminal con colores.

Supongamos que deseas inspeccionar los recursos de memoria o CPU que un proceso está consumiendo. En ese caso, puedes usar el interruptor p de top como se muestra a continuación.

top -p 2113
The top command displaying information on only one PID, 2113.

Tal vez necesites mostrar todos los procesos en ejecución para un nombre de usuario específico. El comando top ofrece el interruptor u para mostrar solo los procesos de un usuario específico. Como se muestra en el ejemplo a continuación, se muestran los PIDs que coinciden solo con el ID de usuario bkindle.

top -u bkindle
The top command displaying only processes for the user bkindle.

Localizando PIDs de procesos específicos con el comando pgrep

Originalmente un comando de Solaris, pgrep se portó para su uso con Linux. Combinando el poder de búsqueda del comando grep y la administración de procesos de ps, pgrep ofrece flexibilidad para encontrar el proceso exacto al que apuntar.

Aunque ps muestra más información, pgrep está diseñado para devolver solo el PID de los procesos encontrados. pgrep ayuda a localizar el proceso utilizando los muchos parámetros de búsqueda disponibles. En el siguiente ejemplo, se muestra cómo pgrep busca cualquier proceso que coincida con vmtoolsd.

pgrep vmtoolsd
Using pgrep to obtain all PIDs associated with vmtoolsd.

De manera similar, especifique un ID de usuario con el interruptor u para recuperar solo los procesos asociados con ese usuario específico. Como se muestra a continuación, se devuelve solo un PID para el usuario bkindle y el proceso vmtoolsd.

pgrep -u bkindle vmtoolsd
Retrieving the specific PID for the vmtoolsd process associated with the user bkindle.

Encontrar procesos con el cmdlet Get-Process de PowerShell en Linux

Los comandos típicos de Linux funcionan muy bien, pero ¿sabías que PowerShell también puede administrar procesos de Linux? El cmdlet Get-Process funciona de manera similar al comando ps de Linux y devuelve información de los procesos. Por ejemplo, tal vez necesites encontrar todos los procesos en ejecución del usuario actual, bkindle. Como se muestra a continuación, encuentra todos los PID (etiquetados como ID por Get-Process) del usuario bkindle.

Get-Process -IncludeUserName |
	Where-Object {$_.UserName -eq 'bkindle'} |
	Select-Object -Property 'Id','UserName','ProcessName'
Retrieving Linux PID’s with PowerShell’s Get-Process cmdlet.

Relacionado: Cómo usar PowerShell Where-Object para filtrar todas las cosas

Habiendo aprendido cómo localizar diferentes procesos, ¡continúa leyendo para descubrir todas las formas de finalizar o matar un proceso en Linux!

Finalizar procesos usando los comandos Kill en Linux

En las secciones anteriores, aprendiste cómo localizar el PID del proceso al que deseas enviar una señal de finalización utilizando comandos nativos de Linux y PowerShell. Las siguientes secciones explicarán cómo utilizar los programas kill y pkill, sus señales asociadas y los interruptores de línea de comando.

Señales de Linux y gestión de procesos

Las señales son el método que Linux utiliza para comunicarse con los procesos que se ejecutan en el sistema operativo. Las tres señales principales que el comando kill utiliza para terminar procesos son:

  • 1 (SIGHUP) – Termina programas interactivos y hace que los demonios (servicios en segundo plano) vuelvan a leer los archivos de configuración que utiliza el proceso.
  • 9 (SIGKILL) – Obliga al proceso a salir sin realizar tareas de cierre ordenado.
  • 15 (SIGTERM) – Permite que un proceso se termine de manera ordenada, como cerrar archivos abiertos al finalizar. Esta es la señal predeterminada que se utiliza cuando no se especifica ningún número al usar el comando kill.

Aunque este artículo se centra solo en las tres señales principales utilizadas para terminar procesos, hay un total de 64 señales disponibles. Usa kill -l para obtener la lista de señales y sus números correspondientes.

Great video on understanding process signals

Ahora que entiendes las tres señales principales utilizadas para terminar un proceso, aprende cómo matar un proceso en las siguientes secciones.

Usando el comando kill para terminar un proceso

En el siguiente ejemplo, utilizarás el comando kill. Imagina por un momento que estás ejecutando una instancia de PowerShell llamada pwsh y el PID asignado es 22687. Una forma de terminar este proceso se muestra a continuación.

  1. Usa pgrep pwsh para determinar el PID del proceso pwsh, que se utiliza en el comando kill.
  2. Use kill -s TERM 22687 para terminar el proceso pwsh de manera segura. El comando TERM se mapea a la señal 15 (SIGTERM) y se indica utilizando el parámetro s del comando kill.
  3. Usa tu elección de top, ps o pgrep para verificar que el PID ya no aparezca en la lista.

A continuación se muestra un ejemplo del proceso anterior desde una terminal bash de Ubuntu 20.04 LTS.

Using kill and associated commands to terminate the pwsh process.

El comando killall terminará todos los procesos basados en su nombre en lugar del PID, lo cual puede ser bastante destructivo si se usa descuidadamente. Sin embargo, si decides usar este comando, usa la opción i para que el comando solicite confirmación.

Finalizar procesos por nombre con pkill

Es posible que hayas notado que el comando kill solo funciona con IDs de proceso. Esto puede hacer que la terminación de un proceso sea un proceso complicado y de varios pasos. El comando pkill, incluido en los paquetes procps y procps-ng, termina un proceso basado en su nombre de búsqueda.

Funcionalmente, el comando pkill actúa como un envoltorio alrededor del programa pgrep. El comando pkill envía una señal especificada a cada proceso encontrado en lugar de solo listar los PID en la terminal. pkill difiere de kill en que pkill solo puede usar el nombre de un proceso, no el PID.

El comando pkill no está disponible, de forma predeterminada, en Ubuntu 20.04 LTS. Deberás descargar e instalar la aplicación. Para hacerlo, ejecuta sudo apt install mcollective-plugins-process -y.

Para matar un proceso usando pkill, sigue los siguientes pasos:

  1. Usa el comando ps para verificar si la aplicación nano (un editor de texto en línea de comandos) está en ejecución. Este paso es opcional, pero es una verificación de seguridad antes de matar un proceso.
  2. Usa pkill -9 nano para terminar forzosamente la aplicación nano.

A continuación se muestra un ejemplo de este proceso desde una terminal bash de Ubuntu 20.04 LTS.

Using the pkill command to forcefully terminate the nano process.

Matar un proceso con el comando Top

Cuando ejecutas el comando top para ver los procesos en ejecución, puedes matar un proceso específico con la tecla k. Verás un mensaje interactivo que te pedirá el PID del proceso que deseas matar.

Como se muestra a continuación, ejecuta el comando top y presiona k. Ingresa el PID que deseas matar y presiona la tecla Enter para terminar inmediatamente el PID.

Use top to specify a process to terminate using the k keystroke.

A continuación, ¡aprende otra alternativa a los comandos nativos de Linux usando el comando Stop-Process de PowerShell!

Usando el comando Stop-Process de PowerShell para terminar un proceso

Si los comandos nativos de Linux no son de tu estilo, ¡PowerShell tiene la solución! Al igual que con el comando kill, puedes terminar procesos usando el cmdlet Stop-Process en Linux. Una vez más, supongamos que estás ejecutando un proceso de PowerShell pwsh.

  1. Encuentra el PID con Get-Process -ProcessName 'pwsh' y anota los PIDs a terminar.
  2. Utiliza Stop-Process -Id 29992,30014 para terminar los múltiples procesos obtenidos.
  3. Utiliza Get-Process -ProcessName 'pwsh' y verifica que los PIDs 29992 y 30014 ya no estén en la lista, lo que significa que han sido terminados.

También puedes usar Get-Process y el método kill para terminar uno o varios procesos: (Get-Process -Id [PID]).Kill() o (Get-Process -Id [PID1,2,3,4]).Kill().

Ten cuidado al usar el parámetro ProcessName. Usar este parámetro se comporta de manera similar al comando killall y terminará todos los procesos que coincidan con los nombres proporcionados.

A continuación se muestra un ejemplo del proceso anterior desde una terminal bash de Ubuntu 20.04 LTS.

Using PowerShell, Stop-Process to kill processes in Linux.

Próximos pasos

¡Ahora deberías saber las muchas formas de encontrar y terminar procesos en Linux! Para tu próximo desafío, intenta matar procesos de forma remota usando conexiones SSH o matando procesos que puedan estar ejecutándose en contenedores.

Relacionado: Un chico de Windows en un mundo de Linux: Configuración de SSH en Linux

Source:
https://adamtheautomator.com/linux-kill-process/