Gestión y Monitoreo de Procesos en Linux

CompTIABeginner
Practicar Ahora

Introducción

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

Comenzarás iniciando una tarea en segundo plano utilizando el operador & y verificando 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 tareas mediante fg, bg y Ctrl-Z. Para finalizar la práctica, aprenderás a ajustar la prioridad de un proceso con renice y a terminarlo usando el comando kill, cubriendo así el ciclo de vida completo de la gestión de procesos.

Iniciar y Visualizar un Proceso en Segundo Plano con & y jobs

En este paso, aprenderás a ejecutar un comando en segundo plano y a consultar el estado de las tareas que se ejecutan de esa forma. En una terminal de Linux, lo habitual es ejecutar un comando y esperar a que termine antes de que vuelva a aparecer el cursor. Esto se conoce como ejecutar un proceso en primer plano (foreground). Sin embargo, para tareas que tardan mucho tiempo, es posible que prefieras ejecutarlas en segundo plano (background) para poder seguir usando la terminal para otros comandos.

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

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

sleep 300 &

Tras pulsar Enter, verás una salida similar a la siguiente y el cursor de la terminal regresará de inmediato, permitiéndote escribir nuevos comandos.

[1] 12345

La terminal ha iniciado el comando sleep 300 como una tarea en segundo plano. La salida proporciona dos datos clave:

  • [1]: Es el ID de la tarea (job ID). La terminal asigna un ID único a cada proceso en segundo plano.
  • 12345: Es el ID del 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 verificar su estado? Puedes usar el comando jobs, que enumera todas las tareas que se ejecutan en segundo plano en la sesión actual de la terminal.

Ejecuta el comando jobs en tu terminal:

jobs

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

[1]+  Running                 sleep 300 &

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

Inspeccionar Procesos en Ejecución con ps

En el paso anterior, utilizaste el comando jobs para ver el proceso en segundo plano de tu terminal actual. Sin embargo, jobs se limita a tu sesión. Para obtener una visión más amplia de todos los procesos que se ejecutan en el sistema, necesitas una herramienta más potente: ps (process status). El comando ps proporciona una instantánea de los procesos actuales en el momento exacto en que lo ejecutas.

Comencemos ejecutando ps sin ninguna opción. Este comando muestra una captura de los procesos que pertenecen al usuario actual y que están vinculados a la terminal activa.

ps

La salida será mínima, probablemente mostrando solo tu shell (zsh) y el comando ps que acabas de ejecutar. Los PID variará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: muestra la información en un formato orientado al usuario (incluyendo usuario, % de CPU, % de memoria, etc.).
  • x: incluye procesos que no están vinculados 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 los resultados. Busquemos el proceso sleep que iniciaste anteriormente.

ps aux | grep sleep

Este comando filtra la salida de ps aux y muestra solo 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

Probablemente verás dos líneas. 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. Observa que el PID de sleep 300 (en este ejemplo, 23885) coincide con el que viste al ejecutar el comando en segundo plano por primera vez.

Otro formato popular para visualizar 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 del Proceso Padre (PPID).

Probémoslo, usando de nuevo grep para localizar nuestro proceso sleep.

ps -ef | grep sleep

El formato de salida es diferente, pero proporciona información similar. Esta vista es especialmente útil para observar 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

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 procesos específicos rápidamente.

Monitorear Recursos del Sistema con top

En este paso, aprenderás a usar top, una herramienta fundamental para el monitoreo del sistema en tiempo real. Mientras que ps te ofrece una foto estática, top proporciona una vista dinámica y actualizada continuamente de la actividad del sistema, lo que resulta invaluable para identificar procesos que consumen muchos recursos en el momento en que ocurre.

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

top

La interfaz de top ocupará toda la ventana de tu terminal. Se verá algo parecido a esto, con los datos refrescándose 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 globales del sistema como el tiempo de actividad (uptime), número de tareas, carga de CPU (%Cpu(s)) y uso de memoria (MiB Mem).
  • La lista de procesos en la parte inferior muestra los procesos individuales, ordenados por defecto según el uso de CPU (%CPU).

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

  1. Ordenar por uso de memoria: Presiona M (mayúscula). La lista se reordenará basándose en la columna %MEM, mostrando arriba los procesos que más memoria consumen.
  2. Ordenar por uso de CPU: Presiona P (mayúscula). Esto volverá a ordenar la lista por defecto, según la columna %CPU.
  3. Buscar tu proceso sleep: Puedes intentar localizar el proceso sleep que iniciaste antes. Probablemente esté muy abajo en la lista ya que no consume CPU. Puedes usar las teclas de Flecha Abajo y Flecha Arriba para desplazarte por la lista.

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

  1. Salir de top: Presiona q para cerrar la interfaz de top y volver a la línea de comandos.

Has utilizado top para obtener una visión en tiempo real de los procesos y el uso de recursos de tu sistema. Este es el comando de referencia para cualquier administrador de sistemas que deba diagnosticar problemas de rendimiento.

Gestionar el Control de Tareas con fg, bg y Ctrl-Z

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

Trabajemos con el proceso sleep 300 que iniciaste anteriormente. Primero, verifica su estado con el comando jobs para asegurarte de que sigue funcionando.

jobs

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

[1]  + running    sleep 300

Ahora, traigamos esta tarea al primer plano. Para ello, usa el comando fg (foreground) seguido del ID de la tarea precedido por un %. Como nuestro ID de tarea es 1, el comando es:

fg %1

La terminal mostrará el nombre del comando con información adicional de la tarea y el cursor de comandos desaparecerá. La terminal está ahora "ocupada" por el comando sleep 300, esperando a que termine.

[1]  + 394 running    sleep 300

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

Esta acción envía una señal especial (SIGTSTP) al proceso, lo que pausa su ejecución. El proceso no ha terminado; simplemente está suspendido. Verás un mensaje confirmándolo y el cursor volverá a estar disponible.

[1]  + 394 suspended  sleep 300

Ahora, verifica de nuevo el estado de tus tareas:

jobs

La salida mostrará ahora el estado de la tarea como "suspended" (suspendida).

[1]  + suspended  sleep 300

Una tarea detenida puede reanudarse. Puedes hacerlo en primer plano con fg o en segundo plano con bg. Vamos a reanudarla en segundo plano usando el comando bg.

bg %1

La terminal confirmará que la tarea se está ejecutando de nuevo en segundo plano.

[1]  + 394 continued  sleep 300

Puedes verificar su estado una última vez con jobs para ver que ha vuelto a estar en "Running". Has logrado mover con éxito un proceso del segundo al primer plano, detenerlo y reanudarlo en segundo plano.

Ajustar la Prioridad de un Proceso con renice

En este paso, aprenderás a influir en la prioridad de planificació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 (máxima prioridad) y +19 (mínima prioridad). Por defecto, la mayoría de los procesos comienzan con un valor de 0. Un valor de "nice" más alto significa que el proceso es más "amable" con los demás, cediendo tiempo de CPU con más facilidad.

Ajustaremos la prioridad del proceso sleep con el que hemos estado trabajando. Para hacerlo, primero necesitas su ID de Proceso (PID). Puedes encontrarlo de nuevo usando ps y grep.

ps aux | grep sleep

Busca la línea correspondiente a sleep 300 (no el comando grep) 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 que aparezca en tu propia pantalla en los siguientes comandos.

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

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

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

    PID  NI CMD
  23885   5 sleep 300

Como era de esperar, el valor de "nice" predeterminado (NI) es 5.

Ahora, cambiemos este valor usando el comando renice. Aumentaremos el valor a 10, lo que bajará la prioridad del proceso. Los usuarios normales solo pueden aumentar el valor de "nice" de sus propios procesos (haciéndolos de menor prioridad).

renice -n 10 -p <TU_PID>

De nuevo, sustituye <TU_PID> por el PID de tu proceso. El comando informará de la prioridad antigua y la nueva.

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

Finalmente, verifica que el cambio se haya aplicado ejecutando el comando ps otra vez:

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 asegurar que tareas en segundo plano largas y no críticas no interfieran con trabajos más importantes en primer plano.

Finalizar un Proceso con kill

En este paso final, aprenderás a finalizar un proceso. Aunque algunos procesos terminan por sí solos, a menudo necesitarás detener manualmente un proceso que ya no es necesario, que se comporta de forma errónea 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. Por defecto, envía la señal SIGTERM (terminar), que solicita amablemente al proceso que se cierre, permitiéndole realizar operaciones de limpieza antes de salir.

Puedes dirigirte a un proceso usando su ID de Proceso (PID) o, para tareas en segundo plano en tu terminal actual, su ID de tarea. Usar el ID de tarea suele ser más cómodo.

Primero, confirmemos que nuestra tarea 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 la tarea (%1) para finalizarlo.

kill %1

Después de ejecutar el comando, la terminal probablemente imprimirá un mensaje indicando que la tarea ha sido finalizada. Este mensaje puede aparecer inmediatamente o después de que pulses Enter de nuevo.

[1]+  Terminated              sleep 300

Verifiquemos que el proceso realmente ha desaparecido. Ejecuta el comando jobs otra vez.

jobs

El comando no debería producir ninguna salida, ya que no hay más tareas activas en esta sesión de terminal. También puedes usar ps para una doble comprobació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 está en ejecución.

En casos donde un proceso no responde y no reacciona a la señal SIGTERM por defecto, puedes enviar una señal más contundente, SIGKILL (señal número 9), que finaliza el proceso de inmediato sin darle oportunidad de realizar limpieza. El comando sería kill -9 %1. Esto debe usarse como último recurso.

¡Felicidades! Has practicado el ciclo de vida completo 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 tareas, ajustar su prioridad y, finalmente, finalizarlo.

Resumen

En esta práctica de laboratorio, has aprendido las habilidades fundamentales para gestionar y monitorear procesos en un entorno Linux. Comenzaste ejecutando un proceso en segundo plano con el operador & y visualizando 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 del 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 tareas 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 planificación de un proceso mediante renice y a finalizar un proceso de forma controlada utilizando el comando kill con su PID.