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.-%cpupara 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.SIGSTOPoSIGTSTP).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.