Mostrar solo la columna bajo COMANDO del comando `ps` en la terminal


12

Sé que podemos encontrar fácilmente lo siguiente:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

de todos los procesos en ejecución mediante el comando:

sudo ps aux

Mi pregunta es: ¿es posible mostrar la salida de solo la columna debajo COMMANDy nada más?

Respuestas:


18

Usar -obandera

Para enumerar solo sus propios procesos

 ps -o command  

Para enumerar todos los procesos del sistema

 ps -e -o command

Esta no es la única forma de listar comandos, pueden imprimirse con indicadores de línea de comandos o solo como ejecutables (que es lo que commandhace la opción).

De mi comentario a continuación la respuesta:

command, args y cmd todos dan un comando completo. De hecho, man page states command y cmd son alias de args, con las banderas - incluidas. La comunicación solo da el nombre del ejecutable. Los alias a eso son ucmd y ucomm. Leí mal sobre las opciones de AIX, que en realidad se pueden especificar con un formato similar a printf,% a para args,% c para comm

Consulte para man psobtener más información sobre el uso y las opciones de formato disponibles

El enfoque programático sería un poco redundante, ya que psya nos proporciona las opciones de formato, pero se puede hacer awk, lo que es muy útil cuando se trata de resultados en columnas.

ps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'

Sin embargo, tenga en cuenta que este código se rompe si el nombre de usuario contiene espacios en blanco, por ejemplo john doe. Esto se puede modificar con la gsubfunción de agregar que eliminará su nombre de usuario de la pslista. Sin embargo, si hay varios usuarios conectados al sistema, puede ser difícil borrar todos los nombres de usuario de la salida. Por lo tanto, puede ver que la -obandera es mucho más preferida.

Nota al margen, sudono es necesario para enumerar todos los procesos conps


¡Gracias! ¿Hay alguna diferencia entre ps -eo command& ps -eo comm? La única diferencia que encontré fue en commandla salida era como tal: [kthreadd]mientras que en commla salida era como este: kthreadd. ¿Esto significa algo?
Rafael

@Raphael de acuerdo con la página del manual, la diferencia es que commes el formato AIX, donde como commandes el formato de estilo GNU estándar. AIX es otro sistema similar a NIX, por lo que esa opción se puede utilizar para la compatibilidad. De lo contrario, no hay diferencia
Sergiy Kolodyazhnyy

@Serg, acabo de ejecutar el diff <(ps -eo comm) <(ps -eo command)y parece que hay bastante ruido allá abajo, ¿puedes aclararlo?
Andrew

Cuidado, la awksolución se rompe si un nombre de usuario contiene espacios ( aquí ); también tal vez solo ps aux | awk '{ for(i=11;i<=NF;i++) {printf $i" "}; printf "\n" }'?
kos

2
@ Andrew Entonces, he leído el manual un poco más. Entonces command, argsy cmdtodos dan el comando completo. De hecho, los estados de la página man commandy cmdson alias para args, con las -banderas incluidas. El commda el nombre del exacutable solamente. Los alias a eso son ucmdy ucomm. Leí mal acerca de las opciones de AIX, que en realidad se pueden especificar con un formato similar a printf,% a para args,% c para com
Sergiy Kolodyazhnyy

4

Una forma más genérica. Determinamos la columna del comando. De esta manera, no importa para qué interruptores se usen ps.

ps ax | awk -v p='COMMAND' 'NR==1 {n=index($0, p); next} {print substr($0, n)}'

Salida de muestra

% ps aux | awk -v p='COMMAND' 'NR==1 {n=index($0, p); next} {print substr($0, n)}'
/sbin/init splash
[kthreadd]
[ksoftirqd/0]
[kworker/0:0H]
[rcu_sched]
[rcu_bh]
[migration/0]
[watchdog/0]
[watchdog/1]
[migration/1]
[ksoftirqd/1]
[kworker/1:0H]
[watchdog/2]
[migration/2]
[ksoftirqd/2]
[kworker/2:0H]
[khelper]
[kdevtmpfs]
[netns]
[perf]
[khungtaskd]
[writeback]
[ksmd]
[khugepaged]
[crypto]
[kintegrityd]
[bioset]
[kblockd]
[ata_sff]
[md]
[devfreq_wq]
[kswapd0]
[fsnotify_mark]
[ecryptfs-kthrea]
[kthrotld]
[acpi_thermal_pm]
[scsi_eh_0]
[scsi_tmf_0]
[scsi_eh_1]
[scsi_tmf_1]
[ipv6_addrconf]
[deferwq]
[charger_manager]
[kpsmoused]
[scsi_eh_2]
[scsi_tmf_2]
[kworker/0:1H]
[jbd2/sda1-8]
[ext4-rsv-conver]
[kauditd]
[kworker/0:2]
/lib/systemd/systemd-journald
/lib/systemd/systemd-udevd
[…]

¿Y de qué se trata pstree?

Salida de muestra

% pstree -alU
systemd splash
  ├─ModemManager
  │   ├─{gdbus}
  │   └─{gmain}
  ├─NetworkManager --no-daemon
  │   ├─dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /run/sendsigs.omit.d/network-manager.dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-57cfb005-1dc6-410d-aebc-16d8d152abfd-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0
  │   ├─dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d
  │   ├─{gdbus}
  │   └─{gmain}
  ├─VBoxClient --clipboard
  │   └─VBoxClient --clipboard
  │       └─{SHCLIP}
  ├─VBoxClient --display
  │   └─VBoxClient --display
  │       └─{VT_MONITOR}
  ├─VBoxClient --seamless
  │   └─VBoxClient --seamless
  │       └─{X11 events}
  ├─VBoxClient --draganddrop
  │   └─VBoxClient --draganddrop
  │       ├─{dndHGCM}
  │       └─{dndX11}
  ├─VBoxService --pidfile /var/run/vboxadd-service.pid
  │   ├─{automount}
  │   ├─{control}
  │   ├─{cpuhotplug}
  │   ├─{memballoon}
  │   ├─{timesync}
  │   ├─{vminfo}
  │   └─{vmstats}
  ├─VBoxService
  │   ├─{automount}
  │   ├─{control}
  │   ├─{cpuhotplug}
  │   ├─{timesync}
  │   ├─{vminfo}
  │   └─{vmstats}
  ├─accounts-daemon
  │   ├─{gdbus}
  │   └─{gmain}
  ├─agetty --noclear tty1 linux
  ├─apache2 -k start
  │   ├─apache2 -k start
  │   ├─apache2 -k start
  │   ├─apache2 -k start
  │   ├─apache2 -k start
  │   └─apache2 -k start
  ├─at-spi-bus-laun
  │   ├─dbus-daemon --config-file=/etc/at-spi2/accessibility.conf --nofork --print-address 3
  │   ├─{dconf worker}
  │   ├─{gdbus}
  │   └─{gmain}
  ├─at-spi2-registr --use-gnome-session
  │   ├─{gdbus}
  │   └─{gmain}
  ├─atd -f
  ├─avahi-daemon
  │   └─avahi-daemon
  ├─cgmanager -m name=systemd
  ├─colord
  │   ├─{gdbus}
  │   └─{gmain}
  ├─console-kit-dae --no-daemon
  │   ├─62*[{console-kit-dae}]
  │   ├─{gdbus}
  │   └─{gmain}
  ├─cron -f
  ├─cups-browsed
  │   ├─{gdbus}
  │   └─{gmain}
  ├─cupsd -l
  │   └─dbus dbus:// 
  ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
  ├─dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsmasq.pid --listen-address 10.0.3.1 --dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative
  ├─gdm
  │   ├─gdm-session-wor
  │   │   ├─gdm-x-session /usr/bin/gnome-session --autostart /usr/share/gdm/greeter/autostart
  │   │   │   ├─Xorg vt7 -displayfd 3 -auth /run/user/120/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3
  │   │   │   │   ├─{llvmpipe-0}
  │   │   │   │   ├─{llvmpipe-1}
  │   │   │   │   └─{llvmpipe-2}
  │   │   │   ├─dbus-daemon --print-address 4 --session
  │   │   │   ├─gnome-session-b --autostart /usr/share/gdm/greeter/autostart
  │   │   │   │   ├─gnome-settings-
  │   │   │   │   │   ├─{dconf worker}
  │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   ├─{gmain}
  │   │   │   │   │   └─{pool}
  │   │   │   │   ├─gnome-shell --mode=gdm
  │   │   │   │   │   ├─ibus-daemon --xim --panel disable
  │   │   │   │   │   │   ├─ibus-dconf
  │   │   │   │   │   │   │   ├─{dconf worker}
  │   │   │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   │   │   └─{gmain}
  │   │   │   │   │   │   ├─ibus-engine-sim
  │   │   │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   │   │   └─{gmain}
  │   │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   │   └─{gmain}
  │   │   │   │   │   ├─{JS GC Helper}
  │   │   │   │   │   ├─{JS Sour~ Thread}
  │   │   │   │   │   ├─{Sync}
  │   │   │   │   │   ├─{dconf worker}
  │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   ├─{gmain}
  │   │   │   │   │   ├─{llvmpipe-0}
  │   │   │   │   │   ├─{llvmpipe-1}
  │   │   │   │   │   ├─{llvmpipe-2}
  │   │   │   │   │   └─{threaded-ml}
  │   │   │   │   ├─{dconf worker}
  │   │   │   │   ├─{gdbus}
  │   │   │   │   └─{gmain}
  │   │   │   ├─{gdbus}
  │   │   │   └─{gmain}
  │   │   ├─{gdbus}
  │   │   └─{gmain}

[…]

Se agregó una forma más genérica.
AB

Bravo, AB! Resolviste lo que yo y @kos estábamos tratando de resolver, eliminando el nombre de usuario
Sergiy Kolodyazhnyy

1

Encontré una manera tímida de lograr esto desde aquí

sudo ps aux | rev | cut -d ' ' -f 1 | rev

revinvierte la salida de psy luego cortar puede ayudarlo a delimitar el primer campo (¡que es el último!) y luego invertirlo nuevamente ...

trabajó para mi.


2
Los procesos con un espacio en su nombre no se enumerarán correctamente por este método: ps auxsí se enumerará como aux.
Kos

1
sudono es necesario psy el comando recorta muchos de los comandos, por lo que no es muy preciso, si desea trabajar con columnas, usarlo awkes mucho mejor para esa tarea. De hecho, el comando exacto seríaps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'
Sergiy Kolodyazhnyy

@kos sí, me acabo de dar cuenta, gracias por señalarlo, Serg awkdebería funcionar.
Andrew

@Serg +1, OP había solicitado sudo psy pensé awkque sería demasiado complicado para esta tarea y se me ocurrió cut. De todos modos, ¿no deberías actualizar tu respuesta con ese código para que el OP pueda aceptarlo?
Andrew

Es mejor, pero técnicamente los nombres de usuario en Linux pueden contener espacios, lo que podría hacer que ese comando también se confunda. pssimplemente no se puede analizar a ciegas. Creo que el único método seguro aquí es ps -e -o.
kos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.