Gestionar y Monitorear Procesos en Linux

LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás las habilidades esenciales para gestionar y monitorear procesos en un sistema Linux. Explorarás cómo interactuar con procesos que se ejecutan tanto en primer plano (foreground) como en segundo plano (background), lo que te dará un mayor control sobre tu entorno de línea de comandos y los recursos del sistema. Esta experiencia práctica es fundamental para cualquier persona que trabaje con Linux, desde administradores de sistemas hasta desarrolladores.

Comenzarás iniciando un trabajo en segundo plano utilizando el operador & y viendo su estado con jobs. Luego, inspeccionarás los procesos en ejecución con ps, monitorearás la actividad del sistema en tiempo real con top y practicarás el control de trabajos usando fg, bg y Ctrl-Z. Para completar el laboratorio, aprenderás a ajustar la prioridad de un proceso con renice y a terminarlo utilizando el comando kill, abarcando así todo el ciclo de vida de la gestión de procesos.

Iniciar y ver un proceso en segundo plano con & y jobs

En este paso, aprenderás a ejecutar un comando en segundo plano y a ver el estado de los trabajos en segundo plano. En un shell de Linux, normalmente ejecutas un comando y esperas a que termine antes de que vuelva a aparecer el indicador de comandos (prompt). A esto se le llama ejecutar un proceso en primer plano (foreground). Sin embargo, para tareas de larga duración, es posible que desees ejecutarlas en segundo plano para poder seguir utilizando tu terminal con otros comandos.

Para ejecutar un comando en segundo plano, simplemente añade un signo de ampersand (&) al final de la línea de comandos. Vamos a probar esto con el comando sleep, que es una utilidad sencilla que hace una pausa durante un tiempo determinado.

Ejecuta el siguiente comando para ejecutar sleep durante 300 segundos en segundo plano. Esto nos permitirá trabajar con él en los siguientes pasos.

sleep 300 &

Después de presionar Enter, verás algo similar a la siguiente salida, y el indicador de comandos regresará de inmediato, permitiéndote escribir nuevos comandos.

[1] 12345

El shell ha iniciado el comando sleep 300 como un trabajo en segundo plano. La salida proporciona dos datos clave:

  • [1]: Este es el ID de trabajo (job ID). El shell asigna un ID de trabajo único a cada proceso en segundo plano.
  • 12345: Este es el ID de proceso (PID). El sistema operativo asigna un PID único a cada proceso en ejecución. Tu PID será diferente al del ejemplo.

Ahora que el proceso se está ejecutando en segundo plano, ¿cómo puedes comprobar su estado? Puedes utilizar el comando jobs, que enumera todos los trabajos que se ejecutan en segundo plano en la sesión actual del shell.

Ejecuta el comando jobs en tu terminal:

jobs

La salida te mostrará el comando sleep que acabamos de iniciar, junto con su ID de trabajo y su estado actual.

[1]+  Running                 sleep 300 &

Has iniciado con éxito un proceso en segundo plano y sabes cómo comprobar su estado. Esta es una habilidad fundamental para gestionar tareas de larga duración en un sistema Linux. En los siguientes pasos, exploraremos cómo interactuar con este trabajo en segundo plano.

Inspeccionar procesos en ejecución con ps

En este paso, utilizarás el comando ps para inspeccionar los procesos en ejecución. En el paso anterior, utilizaste el comando jobs para ver el proceso en segundo plano en tu shell actual. Sin embargo, jobs se limita a tu sesión. El comando ps proporciona una instantánea más amplia de los procesos actuales en el momento en que lo ejecutas.

Comencemos ejecutando ps sin ninguna opción. Este comando proporciona una instantánea de los procesos propiedad del usuario actual y asociados a la terminal actual.

ps

La salida será mínima, mostrando probablemente solo tu shell (zsh) y el comando ps que acabas de ejecutar. Los PID diferirán en tu sistema.

  PID TTY          TIME CMD
23882 pts/0    00:00:00 zsh
23953 pts/0    00:00:00 ps

Para ver todos los procesos que se ejecutan en el sistema, no solo los de tu terminal, puedes usar ps con opciones. Una combinación muy común y útil es ps aux.

  • a: muestra los procesos de todos los usuarios.
  • u: los muestra en un formato orientado al usuario (mostrando usuario, %CPU, %MEM, etc.).
  • x: incluye los procesos que no están asociados a una terminal.

Una lista larga de procesos no es muy útil si buscas algo específico. Podemos combinar ps con el comando grep para filtrar la salida. Busquemos el proceso sleep que iniciaste en el paso anterior.

ps aux | grep sleep

Este comando filtra la salida de ps aux y muestra únicamente las líneas que contienen la palabra "sleep".

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    23962  0.0  0.0  10788  2240 pts/0    S+   11:52   0:00 grep --color=auto sleep

Es probable que veas dos líneas en la salida. Una es tu proceso sleep 300. La otra es el propio comando grep sleep, que se estaba ejecutando en el momento en que ps capturó la lista de procesos. Observa que el PID de sleep 300 (en este ejemplo, 23885) coincide con el que viste cuando ejecutaste el comando por primera vez en segundo plano.

Otro formato popular para ver procesos es ps -ef.

  • -e: selecciona todos los procesos del sistema.
  • -f: muestra un listado en formato "completo" (full), que incluye información útil como el ID de Proceso Padre (PPID).

Probemos este comando, usando nuevamente grep para encontrar nuestro proceso sleep.

ps -ef | grep sleep

El formato de salida es diferente, pero proporciona información similar. Esta vista es particularmente útil para ver la jerarquía de procesos a través de las columnas PID y PPID.

UID        PID  PPID  C STIME TTY          TIME CMD
labex    23885 23882  0 11:50 pts/0    00:00:00 sleep 300
labex    23964 23882  0 11:53 pts/0    00:00:00 grep --color=auto sleep

Ahora ya has visto cómo usar ps para obtener una instantánea de los procesos del sistema. Al combinarlo con herramientas como grep, puedes encontrar e inspeccionar rápidamente procesos específicos.

Monitorear recursos del sistema con top

En este paso, aprenderás a usar top, una potente herramienta para el monitoreo del sistema en tiempo real. Mientras que ps te ofrece una instantánea estática de los procesos, top proporciona una vista dinámica y actualizada continuamente de la actividad del sistema, lo que lo hace invaluable para identificar procesos que consumen muchos recursos a medida que ocurren.

Para empezar, simplemente escribe top en tu terminal y presiona Enter.

top

Toda la ventana de tu terminal será ocupada por la interfaz de top. Se verá más o menos así, y los datos se actualizarán cada pocos segundos.

top - 12:05:15 up 15 min,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 115 total,   1 running, 114 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1987.2 total,    985.4 free,    501.8 used,    500.0 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1325.4 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  167900  12936   8488 S   0.0   0.6   0:01.15 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
...

La interfaz de top se divide en dos partes principales:

  • El área de resumen en la parte superior muestra estadísticas de todo el sistema, como el tiempo de actividad (uptime), el número de tareas, la carga de la CPU (%Cpu(s)) y el uso de la memoria (MiB Mem).
  • La lista de procesos debajo muestra los procesos individuales, ordenados por uso de CPU (%CPU) de forma predeterminada.

El comando top es interactivo. Puedes usar varias combinaciones de teclas para cambiar su comportamiento. Probemos algunas:

Presiona M (m mayúscula) para ordenar por uso de memoria. La lista se reordenará en función de la columna %MEM, mostrando los procesos que más memoria consumen en la parte superior.

Presiona P (p mayúscula) para ordenar por uso de CPU. Esto devolverá la lista al orden predeterminado, organizado por la columna %CPU.

Intenta localizar el proceso sleep que iniciaste antes. Es probable que esté muy abajo en la lista porque no está usando nada de CPU. Puedes usar las teclas de Flecha Abajo y Flecha Arriba para desplazarte por la lista de procesos.

Cuando hayas terminado de observar, puedes salir de top en cualquier momento.

Presiona q para salir de la interfaz de top y regresar a tu indicador de comandos.

Ahora ya has utilizado top para obtener una vista en tiempo real de los procesos de tu sistema y su uso de recursos. Este es el comando por excelencia para cualquier administrador de sistemas que esté solucionando problemas de rendimiento.

Gestionar el control de trabajos con fg, bg y Ctrl-Z

En este paso, aprenderás a gestionar el estado de tus trabajos en ejecución. Ya sabes cómo iniciar un trabajo en segundo plano, pero ¿qué pasa si inicias un comando de larga duración en primer plano y luego te das cuenta de que necesitas tu terminal de vuelta? El control de trabajos te permite mover procesos entre el primer y el segundo plano, así como pausarlos (detenerlos) y reanudarlos.

Trabajemos con el proceso sleep 300 que iniciaste antes. Primero, comprueba su estado con el comando jobs para asegurarte de que sigue en ejecución.

jobs

Deberías ver tu trabajo sleep ejecutándose en segundo plano.

[1]  + running    sleep 300

Ahora, vamos a traer este trabajo al primer plano. Para hacer esto, utiliza el comando fg (primer plano) seguido del ID de trabajo precedido por un %. Dado que nuestro ID de trabajo es 1, el comando es:

fg %1

El shell mostrará el nombre del comando con información adicional del trabajo, y tu indicador de comandos desaparecerá. La terminal ahora está "ocupada" por el comando sleep 300, esperando a que termine.

[1]  + 394 running    sleep 300

Para recuperar tu terminal sin eliminar el proceso, puedes detenerlo. Presiona la combinación de teclas Ctrl-Z (mantén presionada la tecla Ctrl y presiona Z).

Esta acción envía una señal especial (SIGTSTP) al proceso, lo que pausa su ejecución. El proceso no se termina; simplemente se suspende. Verás un mensaje que confirma esto y tu indicador de comandos regresará.

[1]  + 394 suspended  sleep 300

Ahora, comprueba el estado de tus trabajos de nuevo:

jobs

La salida muestra ahora el estado del trabajo como "suspendido" (suspended).

[1]  + suspended  sleep 300

Un trabajo detenido se puede reanudar. Puedes reanudarlo en primer plano con fg o en segundo plano con bg. Vamos a reanudarlo en segundo plano utilizando el comando bg.

bg %1

El shell confirmará que el trabajo se está ejecutando nuevamente en segundo plano.

[1]  + 394 continued  sleep 300

Puedes verificar su estado por última vez con jobs para ver que ha vuelto a "Ejecutándose" (Running). Ahora has movido con éxito un proceso del segundo plano al primero, lo has detenido y lo has reanudado en segundo plano.

Ajustar la prioridad de los procesos con renice

En este paso, aprenderás a influir en la prioridad de programación de un proceso en ejecución. En Linux, la "amabilidad" (niceness) de un proceso determina cuánto tiempo de CPU recibe en relación con otros procesos. El valor de nice oscila entre -20 (prioridad más alta) y +19 (prioridad más baja). De forma predeterminada, la mayoría de los procesos se iniciarán con un valor de nice de 0. Un valor de nice más alto significa que el proceso es "más amable" con otros procesos, cediendo tiempo de CPU más fácilmente.

Ajustaremos la prioridad del proceso sleep con el que has estado trabajando. Para hacer esto, primero necesitas su ID de proceso (PID). Puedes encontrarlo nuevamente usando ps y grep.

ps aux | grep sleep

Busca la línea correspondiente a sleep 300 (no al comando grep en sí) y anota su PID de la segunda columna.

labex    23885  0.0  0.0   7264   868 pts/0    S    11:50   0:00 sleep 300
labex    24101  0.0  0.0  10788  2240 pts/0    S+   12:15   0:00 grep --color=auto sleep

En este ejemplo, el PID es 23885. Debes usar el PID de tu propia salida en los siguientes comandos.

Ahora, comprobemos el valor de nice actual (NI) del proceso. El comando ps con la opción -o te permite especificar columnas de salida personalizadas.

ps -o pid,ni,cmd -p <TU_PID>

Reemplaza <TU_PID> con el PID real de tu proceso sleep. Por ejemplo: ps -o pid,ni,cmd -p 23885.

    PID  NI CMD
  23885   0 sleep 300

Como se esperaba, el valor de nice predeterminado (NI) es 0.

Ahora, cambiemos este valor usando el comando renice. Aumentaremos el valor de nice a 10, lo que disminuirá la prioridad del proceso. Los usuarios normales solo pueden aumentar el valor de nice de sus propios procesos (haciendo que tengan una prioridad más baja).

renice -n 10 -p <TU_PID>

Nuevamente, reemplaza <TU_PID> con el PID de tu proceso. El comando informará la prioridad anterior y la nueva.

23885 (process ID) old priority 0, new priority 10

Por último, verifica que el cambio surtió efecto ejecutando el comando ps de nuevo:

ps -o pid,ni,cmd -p <TU_PID>

La salida debería mostrar ahora el nuevo valor de nice.

    PID  NI CMD
  23885  10 sleep 300

Has cambiado con éxito la prioridad de un proceso en ejecución. Esta es una técnica útil para garantizar que las tareas en segundo plano de larga duración y no críticas no interfieran con un trabajo en primer plano más importante.

Terminar un proceso con kill

En este paso, aprenderás a terminar un proceso. Aunque algunos procesos terminan por sí solos, a menudo necesitarás detener manualmente un proceso que ya no se necesita, que no responde correctamente o que se inició con fines temporales, como nuestro comando sleep. La herramienta principal para esto es el comando kill.

El comando kill envía una señal a un proceso específico. De forma predeterminada, envía la señal SIGTERM (terminar), que le pide educadamente al proceso que se cierre, permitiéndole realizar cualquier operación de limpieza antes de salir.

Puedes dirigirte a un proceso utilizando su ID de proceso (PID) o, para trabajos en segundo plano en tu shell actual, su ID de trabajo. Usar el ID de trabajo suele ser más conveniente.

Primero, confirmemos que nuestro trabajo sleep sigue ejecutándose.

jobs

Deberías ver el proceso sleep en la lista.

[1]+  Running                 sleep 300 &

Ahora, usa el comando kill con el ID de trabajo (%1) para terminarlo.

kill %1

Después de ejecutar el comando, es probable que el shell imprima un mensaje en la terminal indicando que el trabajo ha terminado. Este mensaje puede aparecer inmediatamente o después de presionar Enter nuevamente.

[1]+  Terminated              sleep 300

Verifiquemos que el proceso realmente ha desaparecido. Ejecuta el comando jobs de nuevo.

jobs

El comando ahora no debería producir ninguna salida, ya que no hay más trabajos activos en esta sesión de shell. También puedes usar ps para doble verificación.

ps aux | grep sleep

La única línea que podrías ver es el propio comando grep sleep. El proceso original sleep 300 ya no se está ejecutando.

En los casos en que un proceso no responde y no reacciona a la señal predeterminada SIGTERM, puedes enviar una señal más contundente, SIGKILL (señal número 9), que termina el proceso inmediatamente sin darle la oportunidad de limpiarse. El comando sería kill -9 %1. Esto debe usarse como último recurso.

¡Felicitaciones! Ahora has practicado todo el ciclo de vida de la gestión básica de procesos en Linux: iniciar un proceso en segundo plano, inspeccionarlo con ps y top, gestionarlo con el control de trabajos, ajustar su prioridad y, finalmente, terminarlo.

Resumen

En este laboratorio, aprendiste las habilidades fundamentales para gestionar y monitorear procesos en un entorno Linux. Comenzaste ejecutando un proceso en segundo plano utilizando el operador & y viendo su estado con el comando jobs. Luego exploraste cómo inspeccionar todos los procesos en ejecución con ps para encontrar detalles como el ID de proceso (PID), y cómo usar top para el monitoreo en tiempo real del uso de recursos del sistema y los procesos activos.

Además, practicaste el control de trabajos suspendiendo un proceso en primer plano con Ctrl-Z, moviéndolo al segundo plano con bg y trayéndolo de vuelta al primer plano con fg. También aprendiste a ajustar la prioridad de programación de un proceso usando renice y a terminar un proceso de manera limpia usando el comando kill junto con su PID.