En este artículo voy a explicar la forma correcta para listar todos los procesos pertenecientes a un usuario específico, junto con algunas características interesantes de la herramienta ps
.
En todo sistema operativo multiusuario, es común que existan procesos pertenecientes a diferentes usuarios en un determinado momento:
root@devuan:/home/emi# ps --no-headers -A -o user | sort | uniq avahi daemon Debian-exim emi messagebus ntp root rtkit statd
Justamente la principal característica de un sistema operativo multiusuario (todos los sistemas operativos modernos) consiste en permitir la ejecución de procesos de diferentes usuarios al mismo tiempo.
Supongamos entonces que deseamos listar absolutamente todos los procesos a nombre de un determinado usuario. Por instinto, costumbre o simplicidad, tal vez se intente utilizar algún filtrado con grep
sobre la salida de ps aux
o ps -ef
:
root@devuan:/home/emi# ps aux | grep "^emi" emi 2286 0.0 1.5 51812 16160 ? Sl 08:54 0:00 /usr/bin/lxsession -s LXDE -e LXDE emi 2322 0.0 0.2 4724 2472 ? S 08:54 0:00 /usr/bin/dbus-launch --exit-with-session --sh-syntax emi 2323 0.0 0.2 4336 2240 ? Ss 08:54 0:00 /usr/bin/dbus-daemon --fork --print-pid 6 --print-address 8 --session emi 2357 0.0 0.0 15880 276 ? S 08:54 0:00 /usr/bin/VBoxClient --clipboard emi 2359 0.0 0.4 17580 4240 ? Sl 08:54 0:00 /usr/bin/VBoxClient --clipboard emi 2368 0.0 0.0 15880 276 ? S 08:54 0:00 /usr/bin/VBoxClient --display emi 2370 0.0 0.2 15880 2940 ? S 08:54 0:00 /usr/bin/VBoxClient --display emi 2375 0.0 0.0 15880 280 ? S 08:54 0:00 /usr/bin/VBoxClient --seamless emi 2376 0.0 0.2 17564 2272 ? Sl 08:54 0:00 /usr/bin/VBoxClient --seamless emi 2386 0.0 0.0 15880 276 ? S 08:54 0:00 /usr/bin/VBoxClient --draganddrop emi 2387 0.0 0.2 18080 2396 ? Sl 08:54 0:02 /usr/bin/VBoxClient --draganddrop emi 2388 0.0 0.0 4728 212 ? Ss 08:54 0:00 /usr/bin/ssh-agent x-session-manager emi 2396 0.0 0.5 44228 5892 ? Sl 08:54 0:00 /usr/lib/at-spi2-core/at-spi-bus-launcher emi 2401 0.0 0.2 4336 3000 ? S 08:54 0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3 emi 2403 0.0 0.5 28584 5676 ? Sl 08:54 0:00 /usr/lib/at-spi2-core/at-spi2-registryd --use-gnome-session emi 2410 0.0 1.5 56004 16172 ? S 08:54 0:00 openbox --config-file /home/emi/.config/openbox/lxde-rc.xml emi 2414 0.0 1.2 44124 13044 ? Sl 08:54 0:00 lxpolkit emi 2415 0.0 2.5 104012 26516 ? Sl 08:54 0:00 lxpanel --profile LXDE emi 2419 0.0 2.8 132616 29360 ? Sl 08:54 0:02 pcmanfm --desktop --profile LXDE emi 2420 0.0 0.4 7924 5064 ? S 08:54 0:00 xscreensaver -no-splash emi 2424 0.0 0.0 4728 212 ? Ss 08:54 0:00 /usr/bin/ssh-agent -s emi 2427 0.0 2.9 45108 30088 ? S 08:54 0:00 /usr/bin/python -O /usr/share/wicd/gtk/wicd-client.py --tray emi 2433 0.0 2.3 45272 24176 ? Sl 08:54 0:01 /usr/bin/python3 /usr/share/system-config-printer/applet.py emi 2444 0.0 0.4 16736 4288 ? Ssl 08:54 0:00 /usr/lib/menu-cache/menu-cached /run/user/1001/menu-cached-:0 emi 2456 0.0 2.2 87688 22776 ? Sl 08:54 0:02 clipit emi 2460 0.0 0.9 102240 10004 ? S<l 08:54 0:01 /usr/bin/pulseaudio --start --log-target=syslog emi 2530 0.0 2.0 40244 21580 ? Sl 08:55 0:00 lxterminal emi 2531 0.0 0.1 2516 1696 ? S 08:55 0:00 gnome-pty-helper emi 2532 0.0 0.4 6776 4552 pts/0 Ss 08:55 0:00 bash emi 2654 0.0 0.4 12324 4196 ? S 09:02 0:00 sshd: emi@pts/1 emi 2655 0.0 0.4 6792 4512 pts/1 Ss 09:02 0:00 -bash emi 3622 23.5 0.4 7560 4684 ? RN 09:52 0:06 fiberlamp -root
Sin embargo, recurrir al filtrado de una salida no es la solución más robusta cuando se desea utilizar esta información dentro de un script (por ejemplo se desea realizar determinada acción sobre cada PID recuperado pasado como parámetro). Por otro lado, ps
incluye opciones para listar sólo los procesos pertenecientes a un ID o nombre de usuario real (-U
) y efectivo (-u
).
Por ejemplo, si deseamos listar sólo procesos pertenecientes al usuario "emi":
root@devuan:/home/emi# ps -U emi -u emi PID TTY TIME CMD 2286 ? 00:00:00 lxsession 2322 ? 00:00:00 dbus-launch 2323 ? 00:00:00 dbus-daemon 2357 ? 00:00:00 VBoxClient 2359 ? 00:00:00 VBoxClient 2368 ? 00:00:00 VBoxClient 2370 ? 00:00:00 VBoxClient 2375 ? 00:00:00 VBoxClient 2376 ? 00:00:00 VBoxClient 2386 ? 00:00:00 VBoxClient 2387 ? 00:00:03 VBoxClient 2388 ? 00:00:00 ssh-agent 2396 ? 00:00:00 at-spi-bus-laun 2401 ? 00:00:00 dbus-daemon 2403 ? 00:00:00 at-spi2-registr 2410 ? 00:00:00 openbox 2414 ? 00:00:00 lxpolkit 2415 ? 00:00:00 lxpanel 2419 ? 00:00:02 pcmanfm 2420 ? 00:00:00 xscreensaver 2424 ? 00:00:00 ssh-agent 2427 ? 00:00:00 wicd-client 2433 ? 00:00:01 applet.py 2444 ? 00:00:00 menu-cached 2456 ? 00:00:03 clipit 2460 ? 00:00:01 pulseaudio 2530 ? 00:00:00 lxterminal 2531 ? 00:00:00 gnome-pty-helpe 2532 pts/0 00:00:00 bash 2654 ? 00:00:00 sshd 2655 pts/1 00:00:00 bash 3622 ? 00:02:24 fiberlamp <defunct> 3789 ? 00:00:01 popsquares
Si deseamos una salida idéntica a la de ps aux
, especificar el siguiente formato personalizado:
root@devuan:/home/emi# ps -U emi -u emi -o pid,%cpu,%mem,vsz,rss,stat,bsdstart,bsdtime,comm PID %CPU %MEM VSZ RSS STAT START TIME COMMAND 2286 0.0 1.5 51812 16160 Sl 08:54 0:00 lxsession 2322 0.0 0.2 4724 2472 S 08:54 0:00 dbus-launch 2323 0.0 0.2 4336 2240 Ss 08:54 0:00 dbus-daemon 2357 0.0 0.0 15880 276 S 08:54 0:00 VBoxClient 2359 0.0 0.4 17580 4240 Sl 08:54 0:00 VBoxClient 2368 0.0 0.0 15880 276 S 08:54 0:00 VBoxClient 2370 0.0 0.2 15880 2940 S 08:54 0:00 VBoxClient 2375 0.0 0.0 15880 280 S 08:54 0:00 VBoxClient 2376 0.0 0.2 17564 2272 Sl 08:54 0:00 VBoxClient 2386 0.0 0.0 15880 276 S 08:54 0:00 VBoxClient 2387 0.0 0.2 18080 2396 Sl 08:54 0:03 VBoxClient 2388 0.0 0.0 4728 212 Ss 08:54 0:00 ssh-agent 2396 0.0 0.5 44228 5892 Sl 08:54 0:00 at-spi-bus-laun 2401 0.0 0.2 4336 3000 S 08:54 0:00 dbus-daemon 2403 0.0 0.5 28584 5676 Sl 08:54 0:00 at-spi2-registr 2410 0.0 1.5 56004 16172 S 08:54 0:00 openbox 2414 0.0 1.2 44124 13044 Sl 08:54 0:00 lxpolkit 2415 0.0 2.5 104012 26516 Sl 08:54 0:00 lxpanel 2419 0.0 2.8 132616 29360 Sl 08:54 0:02 pcmanfm 2420 0.0 0.4 7924 5064 S 08:54 0:00 xscreensaver 2424 0.0 0.0 4728 212 Ss 08:54 0:00 ssh-agent 2427 0.0 2.9 45108 30088 S 08:54 0:00 wicd-client 2433 0.0 2.3 45272 24176 Sl 08:54 0:01 applet.py 2444 0.0 0.4 16736 4288 Ssl 08:54 0:00 menu-cached 2456 0.0 2.2 87688 22776 Sl 08:54 0:03 clipit 2460 0.0 0.9 102240 10004 S<l 08:54 0:01 pulseaudio 2530 0.0 2.0 40244 21580 Sl 08:55 0:00 lxterminal 2531 0.0 0.1 2516 1696 S 08:55 0:00 gnome-pty-helpe 2532 0.0 0.4 6776 4552 Ss 08:55 0:00 bash 2654 0.0 0.4 12324 4196 R 09:02 0:00 sshd 2655 0.0 0.4 6792 4512 Ss 09:02 0:00 bash 3622 12.6 0.0 0 0 ZN 09:52 2:24 fiberlamp <defunct> 3789 0.2 0.2 6896 2308 SN 10:02 0:01 popsquares
BTW: se observa en la salida un bonito proceso zombie (wonder why...). Por lo que veo a simple vista, hay un temita con el manejo de procesos de XScreenSaver, pero se resuelve solo al acceder a la sesión gráfica y realizar una acción que desactive el salvapantalla (evidentemente cada modo del salvapantalla está implementado por procesos diferentes y al terminar el proceso padre, desaparecen automáticamente todos los hijos, incluyendo los zombies).
Volviendo al tema del artículo...
Por otro lado, también podemos optar por una salida más compacta:
root@devuan:/home/emi# ps -U emi -u emi -o pid,comm PID COMMAND 2286 lxsession 2322 dbus-launch 2323 dbus-daemon 2357 VBoxClient 2359 VBoxClient 2368 VBoxClient 2370 VBoxClient 2375 VBoxClient 2376 VBoxClient 2386 VBoxClient 2387 VBoxClient 2388 ssh-agent 2396 at-spi-bus-laun 2401 dbus-daemon 2403 at-spi2-registr 2410 openbox 2414 lxpolkit 2415 lxpanel 2419 pcmanfm 2420 xscreensaver 2424 ssh-agent 2427 wicd-client 2433 applet.py 2444 menu-cached 2456 clipit 2460 pulseaudio 2530 lxterminal 2531 gnome-pty-helpe 2532 bash 2654 sshd 2655 bash
O incluso recuperar únicamente los PID, sin la cabecera en la salida, para pasar como argumento a otra herramienta, programa o script:
root@devuan:/home/emi# ps --no-headers -U emi -u emi -o pid | tr -d ' ' 2286 2322 2323 2357 2359 2368 2370 2375 2376 2386 2387 2388 2396 2401 2403 2410 2414 2415 2419 2420 2424 2427 2433 2444 2456 2460 2530 2531 2532 2654 2655
En este caso se utiliza tr
para eliminar el espacio en blanco inicial en cada línea de la salida.
Para más información, acceder a la página de manual de ps
(man ps
).