Listando procesos del sistema en GNU/Linux

Publicado por Diego Córdoba en

Un proceso es una instancia de un programa en ejecución. Un sistema operativo corriendo, las aplicaciones que nosotros ejecutamos, cada comando, cada servicio, el entorno de escritorio o gestor de ventanas… todos son procesos corriendo en un procesador.

Los procesos son la parte «viva» del sistema operativo, son el componente que le da vida nuestra computadora, y resuelven nuestras tareas.

Veremos en el artículo de hoy algunos comando interesantes para administrar y conocer los procesos que están corriendo en nuestra computadora, particularmente, en nuestro sistema GNU/Linux 🙂

Listando los procesos

Para listar los procesos del sistema uno de los comandos más útiles es el comando «ps».
ps muestra el listado de procesos que están corriendo o ejecutándose en el momento de lanzar el comando.
Veamos un ejemplo:

die@tuta2:~$ ps
  PID TTY          TIME CMD
 3609 pts/1    00:00:00 bash
 5135 pts/1    00:00:00 ps

El comando ps muestra por defecto los procesos pertenecientes a la terminal de usuario que lo ejecuta, por lo que solo se suelen ver unos pocos. En el ejemplo, solo el proceso bash, nuestro intérprete de comandos, y el propio proceso ps en ejecución.

Con el modificador «a» podremos ver los procesos sin restricciones de usuario, incluidos los procesos del sistema.

die@tuta2:~$ ps a
  PID TTY      STAT   TIME COMMAND
 3394 tty1     Ss     0:00 /bin/login --    
 3395 tty2     Ss+    0:00 /sbin/getty 38400 tty2
 3474 tty1     S+     0:00 -bash
 3536 tty1     S+     0:00 xinit /home/die/.xinitrc -- /etc/X11/xinit/xserver
 3537 tty3     Ss+    4:26 /usr/bin/X -nolisten tcp :0 -auth /tmp/serverauth.
 3545 tty1     Sl     0:00 /usr/bin/lxsession -s LXDE -e LXDE
 3553 tty1     S      0:00 dbus-launch --sh-syntax --exit-with-session
 3564 tty1     S      0:03 openbox --config-file /home/die/.config/openbox/lx
 3566 tty1     Sl     0:08 lxpanel --profile LXDE
 3567 tty1     Sl     0:00 pcmanfm --desktop --profile LXDE
 3568 tty1     S      0:00 xscreensaver -no-splash
 3574 tty1     Sl     0:01 /usr/bin/python /usr/share/system-config-printer/a
 3576 tty1     Sl     0:00 /usr/lib/i386-linux-gnu/libmenu-cache1/libexec/men
 [...]

Otro modificador interesante, es «u», que nos mostrará el usuario que está ejecutando cada proceso.
Veamos los procesos de nuestro usuario actual, con información adicional relativa a consumo de memoria RAM, virtual, tiempo de procesamiento, etc.

die@tuta2:~$ ps u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
die       3474  0.0  0.1   5808  2556 tty1     S+   16:17   0:00 -bash
die       3536  0.0  0.0   3612   744 tty1     S+   16:17   0:00 xinit /home/
die       3545  0.0  0.2  48852  5056 tty1     Sl   16:17   0:00 /usr/bin/lxs
die       3553  0.0  0.0   3864   584 tty1     S    16:17   0:00 dbus-launch 
die       3564  0.0  0.4  17624  8764 tty1     S    16:17   0:03 openbox --co
die       3566  0.1  0.7 268384 15804 tty1     Sl   16:17   0:08 lxpanel --pr
die       3567  0.0  0.5 213316 11636 tty1     Sl   16:17   0:00 pcmanfm --de
die       3568  0.0  0.1   7056  2456 tty1     S    16:17   0:00 xscreensaver
die       3574  0.0  0.5  34372 11528 tty1     Sl   16:17   0:01 /usr/bin/pyt
die       3576  0.0  0.1  18528  3008 tty1     Sl   16:17   0:00 /usr/lib/i38
die       3582  0.6  6.0 450692 124464 tty1    Sl   16:17   0:42 claws-mail
die       3589  0.5  1.9 261764 40328 tty1     Sl   16:17   0:34 pidgin
[...]

Complementémoslo con la salida anterior de esta forma para ver los procesos del sistema y el usuario responsable de cada uno:

die@tuta2:~$ ps au
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3394  0.0  0.0   4256  2060 tty1     Ss   16:17   0:00 /bin/login -
root      3395  0.0  0.0   4188   872 tty2     Ss+  16:17   0:00 /sbin/getty 
die       3474  0.0  0.1   5808  2556 tty1     S+   16:17   0:00 -bash
die       3536  0.0  0.0   3612   744 tty1     S+   16:17   0:00 xinit /home/
root      3537  4.2  5.6 150396 118056 tty3    Ss+  16:17   4:29 /usr/bin/X -
die       3545  0.0  0.2  48852  5056 tty1     Sl   16:17   0:00 /usr/bin/lxs
die       3553  0.0  0.0   3864   584 tty1     S    16:17   0:00 dbus-launch 
die       3564  0.0  0.4  17624  8764 tty1     S    16:17   0:03 openbox --co
die       3566  0.1  0.7 268384 15804 tty1     Sl   16:17   0:08 lxpanel --pr
die       3567  0.0  0.5 213316 11636 tty1     Sl   16:17   0:00 pcmanfm --de
die       3568  0.0  0.1   7056  2456 tty1     S    16:17   0:00 xscreensaver
[...]

Además, podremos ver procesos que no están corriendo en ninguna terminal (ni tty ni pseudo-terminal pts) utilizando el modificador «x». Aquí veremos algunos procesos o daemons del sistema operativo:

die@tuta2:~$ ps x
  PID TTY      STAT   TIME COMMAND
 3474 tty1     S+     0:00 -bash
 3536 tty1     S+     0:00 xinit /home/die/.xinitrc -- /etc/X11/xinit/xserver
 3545 tty1     Sl     0:00 /usr/bin/lxsession -s LXDE -e LXDE
 3553 tty1     S      0:00 dbus-launch --sh-syntax --exit-with-session
 3554 ?        Ss     0:01 /usr/bin/dbus-daemon --fork --print-pid 5 --print-
 3557 ?        Sl     0:00 /usr/lib/gvfs/gvfsd
 3564 tty1     S      0:03 openbox --config-file /home/die/.config/openbox/lx
 3566 tty1     Sl     0:08 lxpanel --profile LXDE
 3567 tty1     Sl     0:00 pcmanfm --desktop --profile LXDE
 3568 tty1     S      0:00 xscreensaver -no-splash
 3574 tty1     Sl     0:01 /usr/bin/python /usr/share/system-config-printer/a
 3576 tty1     Sl     0:00 /usr/lib/i386-linux-gnu/libmenu-cache1/libexec/men
 3582 tty1     Sl     0:43 claws-mail
 3589 tty1     Sl     0:35 pidgin
 3591 tty1     Sl     1:14 pumpa
 3593 tty1     Sl     0:00 tilda
 3596 ?        S<l    0:00 /usr/bin/pulseaudio --start

Listando el árbol de procesos

En algún otro artículo hablaremos sobre la generación de procesos por clonación o «fork», y veremos que los procesos se relacionan entre sí en una estructura de árbol, donde poseemos procesos «padre» y procesos «hijo», donde el proceso hijo es un proceso independiente generado a partir de otro proceso. Por ejemplo, cuando corremos un comando en la terminal, concretamente en un intérprete de comandos como bash, el comando genera un proceso que es automáticamente un «hijo» de nuestro intérprete.

Esta relación podemos verla de dos formas.

Una es utilizando el modificador «f» en el comando ps de esta forma:

die@tuta2:~$ ps f
  PID TTY      STAT   TIME COMMAND
 3474 tty1     S+     0:00 -bash
 3536 tty1     S+     0:00  _ xinit /home/die/.xinitrc -- /etc/X11/xinit/xse
 3545 tty1     Sl     0:00      _ /usr/bin/lxsession -s LXDE -e LXDE
 3564 tty1     S      0:03          _ openbox --config-file /home/die/.confi
 3566 tty1     Sl     0:08          _ lxpanel --profile LXDE
 3567 tty1     Sl     0:00          _ pcmanfm --desktop --profile LXDE
 3568 tty1     S      0:00          _ xscreensaver -no-splash
 3604 tty1     S      0:00 lxclipboard
 3593 tty1     Sl     0:01 tilda
 3608 tty1     S      0:00  _ gnome-pty-helper
 3609 pts/1    Ss     0:00  _ /bin/bash
 5317 pts/1    R+     0:00      _ ps f

Aquí se puede apreciar en la última línea el propio comando «ps f» como proceso hijo del bash en el que lo estoy ejecutando.

La otra es utilizando el comando «pstree», que puede instalarse desde el gestor de paquetes de casi cualquier distribución. Por ejemplo en Debian y derivados:

apt-get install pstree

Su salida será algo similar a esta:

die@tuta2:~$ pstree
init─┬─acpid
     ├─cupsd
     ├─2*[dbus-daemon]
     ├─dbus-launch
     ├─dropbox───20*[{dropbox}]
     ├─firefox───39*[{firefox}]
     ├─getty
     ├─gvfs-mtp-volume───{gvfs-mtp-volume}
     ├─gvfs-udisks2-vo───{gvfs-udisks2-vo}
     ├─gvfsd───{gvfsd}
     ├─gvfsd-dnssd───3*[{gvfsd-dnssd}]
     ├─gvfsd-metadata───{gvfsd-metadata}
     ├─gvfsd-network───4*[{gvfsd-network}]
     ├─gvfsd-trash───3*[{gvfsd-trash}]
     ├─2*[leafpad───leafpad1───{leafpad1}]
     ├─login───bash───xinit─┬─Xorg
     │                      └─lxsession─┬─lxpanel───2*[{lxpanel}]
     │                                  ├─openbox
     │                                  └─2*[{lxsession}]
     ├─saned───saned
     ├─scanlogd
     ├─snmpd
     ├─sshd
     ├─thunar───2*[{thunar}]
     ├─tilda─┬─bash───pstree

Como se habrá observado en las salidas del comando «ps», todos los procesos se identifican con un número llamado «process Id», o PID. En el comando pstree podemos ver también los PID’s de los procesos usando el modificador «-p» de esta forma:

die@tuta2:~$ pstree -p
init(1)─┬─acpid(2540)
        ├─applet.py(3574)───{applet.py}(3677)
        ├─at-spi-bus-laun(3824)─┬─{at-spi-bus-laun}(3825)
        │                       └─{at-spi-bus-laun}(3827)
        ├─atd(2517)
        ├─avahi-daemon(2761)───avahi-daemon(2762)
        ├─bluetoothd(2791)
        ├─claws-mail(3582)─┬─{claws-mail}(3709)
        │                  ├─{claws-mail}(3775)
        │                  ├─{claws-mail}(3795)
        │                  ├─{claws-mail}(3796)

Cabe aclarar además que los modificadores de todos estos comandos pueden combinarse para obtener salidas más acordes a las necesidades. Por ejemplo, un comando que yo suelo utilizar mucho para listar mis procesos independientemente de la terminal en la que corren, independientemente del usuario que los corre, y teniendo en cuenta las relaciones de padre-hijo, es «ps fax».

Listando procesos en tiempo real.

Podremos ver los procesos del equipo en tiempo real, sus consumos de CPU y memoria, los consumos de swap, etc, utilizando herramientas de gestión de procesos como top, o su versión mejorada, htop.

Top suele venir instalado con las distribuciones, htop deberemos, por lo general instalarlo con algun gestor de paquetes, o compilando desde los fuentes.

Veamos un par de capturas:

El comando top:

top procesos

El comando htop:

htop procesos

Ambos programas nos permitirán ver interesante información sobre consumo de recursos del equipo en cuando a procesamiento, uptime, consumo de memoria virtual, buffers de disco, consumo de memoria swap de intercambio, total de tareas en ejecución, etc.

Y por si fuese poco, también nos permitirán administrar dichos procesos, cambiar sus prioridades, «matar» procesos, configurar la salida, ver las relaciones de padre-hijo en el arbol de procesos, etc.

Muchas de estas tareas las comentaremos en un post específico sobre administración de procesos, y el uso de top/htop, kill, killall, nice, renice, etc para llevar a cabo estos objetivos.

Esperamos que les sea de utilidad!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador