Cómo usar el comando ps en Linux para listar procesos en ejecución
El comando ps en Linux genera una lista con todos los procesos en ejecución y sus atributos.
Hubo un momento en Linux en que coexistieron dos versiones del comando ps en diferentes distribuciones. Hace poco los desarrolladores decidieron unir las dos versiones del ps en una única versión, pero dejaron las opciones de ambas versiones coexistiendo.
De esta forma, al informar un parámetro en el ps, los resultados van a ser diferentes:
- Sin usar el signo menos, el ps se comporta mostrando los procesos en el estilo BSD;
- Con un signo menos apenas "-" el ps se comporta mostrando los procesos en el estilo de Unix, usando el estándar POSIX;
- Con dos signos menos "--" el ps se comporta mostrando los procesos en el estilo GNU.
No existe correcto o incorrecto, simplemente preferencia histórica.
Las opciones más frecuentes del ps son:
- a Muestra los procesos en ejecución conectados a una terminal, de todos los usuarios;
- -a Muestra los procesos en ejecución conectados a una terminal, exceptuando los procesos de sesión;
- -e, -A Muestra todos los procesos;
- -u Muestra la lista de procesos incluyendo el nombre de los usuarios propietarios de los procesos e inicio de las ejecuciones, porcentaje de CPU utilizada, porcentaje de memoria utilizada y terminal asociado;
- -x Muestra la lista de procesos, incluyendo aquellos que no tienen una terminal asociada a él. Útil para visualizar procesos servidores (daemons);
- -f Muestra los procesos en forma de árbol. Muy útil para identificar la relación de proceso padre e hijo entre los procesos en ejecución;
- -H Muestra la jerarquía de los procesos en forma de árbol;
Consulta el help del comando ps para más opciones.
En este ejemplo el ps solamente muestra los procesos del usuario logueado y conectados a la terminal:
$ ps
PID TTY TIME CMD
1415 pts/0 00:00:00 ps
30019 pts/0 00:00:00 bash
Para mostrar todos los procesos de todos los usuarios conectados a una terminal:
$ ps a PID TTY STAT TIME COMMAND 1628 pts/0 R+ 0:00 ps a 3297 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux27159 pts/0 T 0:00 sudo find / -iname backup.sh27160 pts/0 T 0:00 find / -iname backup.sh30019 pts/0 Ss 0:00 -bash
Observa cómo la opción "-a" es diferente de "a":
$ ps -a PID TTY TIME CMD 1675 pts/0 00:00:00 ps27159 pts/0 00:00:00 sudo27160 pts/0 00:00:00 find
La opción "u" agrega algunos atributos de los procesos:
$ ps auUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 3297 0.0 0.0 121336 1600 tty1 Ss+ ago15 0:00 /sbin/agetty --noclear tty1 linuxroot 3298 0.0 0.1 120984 2064 ttyS0 Ss+ ago15 0:00 /sbin/agetty --keep-baud 115200,38400,9600 ec2-user 3414 0.0 0.1 164440 4032 pts/0 R+ 18:38 0:00 ps auroot 27159 0.0 0.3 216984 6608 pts/0 T 17:46 0:00 sudo find / -iname backup.shroot 27160 0.0 0.1 128308 3944 pts/0 T 17:46 0:00 find / -iname backup.shec2-user 30019 0.0 0.2 127120 4348 pts/0 Ss 14:48 0:00 -bash
Para obtener una lista completa de los procesos en ejecución, no solo aquellos que están conectados a la terminal, agrega la opción "x":
$ ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.2 199452 4968 ? Ss ago15 9:23 /usr/lib/systemd/systemd --switched-root --root 2 0.0 0.0 0 0 ? S ago15 0:00 [kthreadd]( ... )ec2-user 30018 0.0 0.2 152864 4384 ? S 14:48 0:00 sshd: ec2-user@pts/0ec2-user 30019 0.0 0.2 127120 4348 pts/0 Ss 14:48 0:00 -bashpostfix 30391 0.0 0.3 90536 6928 ? S 18:06 0:00 pickup -l -t unix -u
Los procesos cuyo comando está envuelto en corchetes, como en el destaque de [ktheradd], indican que fueron removidos de la memoria RAM y colocados en la memoria virtual en disco. Cuando los procesos están en la memoria virtual en disco, se llaman sleeping.
El Kernel coloca con frecuencia los procesos a dormir, mientras están esperando algún evento, que puede ser, por ejemplo, cargar datos del disco o una conexión de red. Cuando el evento se activa, el Kernel envía una señal al proceso.
Las opciones "efH" muestran todos los procesos, con su jerarquía en forma de árbol:
$ ps -efHUID PID PPID C STIME TTY TIME CMDroot 3252 1 0 ago15 ? 00:00:00 /usr/sbin/sshd -Droot 29998 3252 0 14:48 ? 00:00:00 sshd: ec2-user [priv]ec2-user 30018 29998 0 14:48 ? 00:00:00 sshd: ec2-user@pts/0ec2-user 30019 30018 0 14:48 pts/0 00:00:00 -bashec2-user 4176 30019 0 18:43 pts/0 00:00:00 ps -efH
Es posible experimentar con los comandos, como, por ejemplo, saber cuáles son los procesos que más consumen CPU:
$ ps aux | sort -nrk 3,3 | head -n 5USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDnginx 3342 0.2 1.6 426976 34048 ? Sl ago15 133:04 amplify-agentrpc 2729 0.0 0.1 73828 3276 ? Ss ago15 0:02 /sbin/rpcbind -wroot 9421 0.0 0.0 0 0 ? I set13 0:01 [kworker/u30:1]root 9 0.0 0.0 0 0 ? I ago15 0:00 [rcu_bh]
Una opción bastante interesante para los programadores es ver los procesos en ejecución ordenados por el consumo de memoria. Para eso, basta con cambiar la columna del sort a 4:
$ ps -aux | sort -nk 4 | head -5chrony 745 0.0 0.0 80736 2988 ? S mar17 0:52 /usr/sbin/chronyddbus 727 0.0 0.0 8872 3668 ? Ss mar17 12:10 /usr/bin/dbus-daemon --systemec2-user 24036 0.0 0.0 21720 5108 ? S 11:37 0:01 sshd: ec2-user@pts/0ec2-user 24037 0.0 0.0 117164 6248 pts/0 Ss 11:37 0:00 -bashec2-user 32446 0.0 0.0 118552 3448 pts/0 R+ 16:51 0:00 ps -aux
Independientemente de cómo se quieran ver los procesos en ejecución, algunos atributos son importantes para un administrador Linux, tales como:
Usuario propietario del proceso (UID)
Es imposible ejecutar un programa en Linux sin que tenga un usuario propietario. Esto significa que el programa va a tener los permisos de acceso al disco y recursos del usuario que ejecutó el programa. Esta noción es importante, ya que es posible ejecutar un programa como otro usuario que no sea el usuario logueado.
Número de Proceso - Process ID (PID)
Todo programa en ejecución recibe un ID numérico único. Este número puede ser usado para enviar señales al programa en ejecución.
Proceso Padre (PPID)
Todo programa excepto init o systemd tiene un proceso padre, que originó su ejecución. Es común que un programa servidor, por ejemplo, tenga un proceso padre (master) y varios procesos o threads (hijos).
Los threads pueden entenderse como fragmentos del programa que se ejecutan como si fueran procesos hijos, pero más livianos, ya que comparten muchas cosas con el proceso padre. Esta tecnología es muy usada en los procesadores con varios núcleos (cores) para permitir la ejecución de varios threads al mismo tiempo.
% de CPU
Cada proceso recibe una fracción del tiempo de la CPU, que puede ser contabilizada y sirve como parámetro para que el administrador sepa cuáles son los procesos que consumen mucha CPU.
% de Memoria
Cada proceso en ejecución también recibe una fracción de la memoria RAM, que también puede ser contabilizada para que el administrador sepa los procesos que consumen mucha RAM.
Hora de inicio (STIME)
Cada proceso también tiene como atributo la hora en que fue ejecutado.
Tiempo de CPU (TIME)
Cada proceso también tiene como atributo el tiempo de CPU acumulado en su ejecución.
Línea de comando (CMD)
Los procesos también mantienen un atributo que es la línea de comando que fue usada en la ejecución.
Terminal (TTY)
Cada proceso puede o no tener un Terminal asociado. A título de curiosidad, lo que el comando ps en realidad hace es recorrer alguna información del directorio /proc. Toma como ejemplo el proceso sshd:
$ ps aux | grep sshroot 3252 0.0 0.3 112928 7848 ? Ss ago15 0:00 /usr/sbin/sshd -D
Si miramos el directorio /proc, tendrá un subdirectorio con el número 3252, que corresponde al PID del programa sshd:
# cd /proc/3252# lsattr coredump_filter gid_map mem oom_adj root stack timerslack_nsautogroup cpuset io mountinfo oom_score sched stat uid_mapauxv cwd latency mounts oom_score_adj schedstat statm wchancgroup environ limits mountstats pagemap sessionid statusclear_refs exe loginuid net patch_state setgroups syscallcmdline fd map_files ns personality smaps taskcomm fdinfo maps numa_maps projid_map smaps_rollup timers
Por ejemplo, la línea de comando del programa con el PID 3252 puede ser consultada con un simple cat:
# cat cmdline /usr/sbin/sshd-D
Varias informações sobre un proceso se pueden ver en el directorio /proc/[número del PID]. El utilitario ps solo organiza la información para una lectura más humana.
Aprende mucho más sobre Linux en nuestro curso en línea. Puedes realizar la matrícula aquí. Si ya tienes una cuenta, o quieres crear una, simplemente ingresa o crea tu usuario aquí.
¿Te gustó? Comparte
Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.