Listando procesos del sistema en GNU/Linux
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:
El comando htop:
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!