Gestión de Procesos en Linux con el Comando <code>ps</code>

El comando ps, abreviatura de "process status", es una herramienta fundamental en los sistemas operativos Linux para obtener una instantánea de los procesos que se están ejecutando en un momento dado. A diferencia de utilidades como top, que proporcionan una vista dinámica y en tiempo real, ps captura el estado actual de los procesos, lo que es esencial para el diagnóstico, la monitorización y la gestión del sistema.

Comprender cómo utilizar ps permite a los administradores y usuarios identificar qué programas están activos, quién los posee, cuántos recursos cnosumen y cuál es su estado actual. Esto es crucial para solucionar problemas de rendimiento, detectar procesos anómalos o simplemente tener una visión clara de la actividad del sistema.

Opciones Comunes del Comando ps

El comando ps ofrece una amplia gama de opciones para personalizar la salida y filtrar la información. A continuación, se detallan algunas de las más utilizadas:

  • -a: Muestra todos los procesos, excluyendo aquellos que no están asociados con una terminal.
  • -u: Formato orientado al usuario, que incluye detalles como el propietario, el uso de CPU/memoria y la hora de inicio.
  • -x: Incluye procesos que no tienen una terminal de control.
  • -e: Muestra todos los procesos en el sistema. Equivale a -A.
  • -f: Formato completo, que proporciona detalles como el ID del proceso padre (PPID) y el comando completo.
  • -l: Formato largo, con información detallada sobre el estado del proceso.
  • -L: Muestra los hilos (threads) de un proceso junto con los procesos.
  • -p <pid></pid>: Muestra información solo para el ID de proceso (PID) especificado.
  • -C <comando></comando>: Filtra procesos por el nombre del comando.
  • --sort <campo></campo>: Ordena la salida por un campo específico (ej. -%cpu para CPU descendente).

Visualización Detallada de Procesos

Dos de las combinaciones de opciones más populares para obtener una vista completa de los procesos son ps aux y ps -ef.

ps aux: Vista Orientada al Usuario

Esta combinación muestra todos los procesos de todos los usuarios en un formato detallado y legible. Es ideal para una revisión rápida del sistema.

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 228000  5000 ?        Ss   May25   0:05 /sbin/init
root          2  0.0  0.0      0     0 ?        S    May25   0:00 [kthreadd]
daemon      567  0.0  0.0  12345   800 ?        S    May25   0:00 /usr/sbin/atd -f
userdev   12345  0.5  2.3 876543 25000 pts/0    R+   10:30   0:15 python /app/script.py
userdev   12346  0.0  0.1  10000  1200 pts/0    S+   10:30   0:00 sleep 60

  • USER: El usuario propietario del proceso.
  • PID: El ID único del proceso.
  • %CPU: Porcentaje de uso de la CPU.
  • %MEM: Porcentaje de uso de la memoria física.
  • VSZ: Tamaño de la memoria virtual utilizada por el proceso (en KB).
  • RSS: Tamaño de la memoria residente (física) utilizada por el proceso (en KB).
  • TTY: La terminal asociada al proceso. ? indica que no hay una terminal.
  • STAT: El estado actual del proceso.
  • START: La hora o fecha en que se inició el proceso.
  • TIME: El tiempo total de CPU que el proceso ha consumido.
  • COMMAND: El comando que inició el proceso.

ps -ef: Formato Completo de Listado

Esta opción muestra una lista completa de todos los procesos con sus relaciones padre-hijo, utilizando el formato completo.

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 May25 ?        00:00:05 /sbin/init
root          2      0  0 May25 ?        00:00:00 [kthreadd]
root         567      1  0 May25 ?        00:00:00 /usr/sbin/atd -f
userdev    12345   1234  0 10:30 pts/0    00:00:15 python /app/script.py
userdev    12346  12345  0 10:30 pts/0    00:00:00 sleep 60

  • UID: ID de usuario efectivo del propietario del proceso.
  • PID: ID del proceso.
  • PPID: ID del proceso padre.
  • C: Uso de CPU o prioridad (dependiendo de la implementación).
  • STIME: Hora de inicio del proceso.
  • TTY: Terminal asociada.
  • TIME: Tiempo total de CPU.
  • CMD: El comando completo, incluyendo argumentos.

Estados de los Procesos (Columna STAT)

La columna STAT proporciona información vital sobre el estado operativo de un proceso. Los códigos más comunes son:

  • R: Running (En ejecución) o ejecutable (en cola de ejecución).
  • S: Sleeping (Durmiendo). El proceso está esperando un evento (como una entrada/salida o un temporizador).
  • D: Uninterruptible sleep (Sueño ininterrumpible). Generalmente, esperando una E/S. El proceso no puede ser interrumpido por señales.
  • T: Stopped (Detenido). El proceso ha sido detenido por una señal (ej. SIGSTOP o SIGTSTP).
  • Z: Zombie (Zombi). El proceso ha terminado su ejecución, pero su entrada en la tabla de procesos aún no ha sido eliminada por su proceso padre.

Visualización de Jerarquías y Hilos

ps -axjf: Vista en Árbol

Para comprender las relaciones padre-hijo entre los procesos, el formato de árbol es muy útil. La opción -j (jobs) y -f (full) combinadas con -a y -x pueden crear una vista jerárquica.

PPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND
   0      2      0      0 ?            -1 S        0   0:00 [kthreadd]
   2      4      0      0 ?            -1 I<       0   0:00  \_ [kworker/0:0H]
   1    786    786    786 ?        -1 Ss       0   0:00 /usr/sbin/cron -f
   1    788    788    788 ?        -1 Ssl    101   0:00 /usr/sbin/rsyslogd -n
1234  12345  12345  12345 pts/0   12345 R+   1001   0:15 python /app/script.py
12345 12346  12345  12345 pts/0   12345 S+   1001   0:00  \_ sleep 60

El comando pstree es una alternativa más visual para mostrar la jerarquía de procesos.

$ pstree -p userdev
systemd(1)───sshd(123)───bash(1234)───python(12345)───sleep(12346)

ps -Lf <pid></pid>: Listado de Hilos (Threads)

Cuando un proceso es multihilo, ps -Lf permite ver cada hilo como una 'Lightweight Process' (LWP). Esto es crucial para depurar aplicaciones concurrentes.

$ ps -Lf 12345
UID        PID  PPID   LWP  C NLWP STIME TTY      STAT   TIME CMD
userdev  12345  1234 12345  5    3 10:30 pts/0    Sl+    0:10 python /app/script.py
userdev  12345  1234 12347  2    3 10:30 pts/0    Sl+    0:03 python /app/script.py
userdev  12345  1234 12348  1    3 10:30 pts/0    Sl+    0:02 python /app/script.py

Aquí, 12345 es el PID principle del proceso Python, y 12347 y 12348 son los LWPs que representan los hilos secundarios de ese proceso.

Filtrado y Búsqueda de Procesos

Combinar ps con grep es una técnica muy potente para encontrar procesos específicos.

$ ps aux | grep nginx
root        987  0.0  0.1 123456  2500 ?        Ss   May25   0:00 nginx: master process /usr/sbin/nginx
www-data   1012  0.0  0.0 123456  1500 ?        S    May25   0:00 nginx: worker process
userdev   15678  0.0  0.0  10000   800 pts/1    S+   11:45   0:00 grep nginx

Tenga en cuenta que grep a menudo se muestra a sí mismo en los resultados; esto se puede evitar añadiendo corchetes al patrón de búsqueda, como grep '[n]ginx'.

También puede filtrar por comandos específicos usando la opción -C:

$ ps -C sshd
  PID TTY          TIME CMD
  890 ?        00:00:00 sshd
21345 ?        00:00:01 sshd

Control de Procesos con kill

Una vez que ha identificado un proceso con ps, puede gestionarlo utilizando el comando kill para enviar señales. Las señales más comunes incluyen:

  • SIGTERM (15): Solicita amablemente al proceso que termine. Permite que el proceso limpie sus recursos antes de salir.
  • SIGKILL (9): Termina el proceso de forma abrupta e incondicional. No permite que el proceso realice ninguna limpieza. Es el "último recurso".
  • SIGSTOP (19): Detiene un proceso, lo "pausa" sin terminarlo.
  • SIGCONT (18): Reanuda un proceso previamente detenido.
# Envía SIGTERM al proceso con PID 12345
$ kill 12345

# Termina el proceso con PID 54321 de forma forzada
$ kill -9 54321

# Detiene el proceso con PID 9876
$ kill -STOP 9876

# Reanuda el proceso detenido con PID 9876
$ kill -CONT 9876

Perosnalización de la Salida

Para obtener solo la información que necesita, puede especificar las columnas de salida con la opción -o.

$ ps -o pid,user,%cpu,%mem,cmd --sort=-%cpu
    PID USER     %CPU %MEM CMD
  12345 userdev   0.5  2.3 python /app/script.py
   1012 www-data  0.0  0.0 nginx: worker process
      1 root      0.0  0.1 /sbin/init

Este ejemplo muestra el PID, usuario, uso de CPU y memoria, y el comando, ordenado por el uso de CPU de forma descendente.

Etiquetas: linux procesos ps command gestión de procesos CLI

Publicado el 7-27 19:28