Saída apenas a coluna sob COMMAND do comando `ps` no terminal


12

Eu sei que podemos encontrar facilmente o seguinte:

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

de todos os processos em execução usando o comando:

sudo ps aux

Minha pergunta é: é possível mostrar a saída apenas da coluna abaixo COMMANDe nada mais?

Respostas:


18

Use -oflag.

Para listar apenas seus próprios processos

 ps -o command  

Para listar todos os processos do sistema

 ps -e -o command

Essa não é a única maneira de listar comandos, eles podem ser impressos com sinalizadores de linha de comando ou apenas como executáveis ​​(que é a commandopção).

Do meu comentário abaixo a resposta:

command, args e cmd fornecem comando completo. De fato, man page states command e cmd são aliases para args, com os sinalizadores - incluídos. A comunicação fornece apenas o nome do exacutável. Aliases para isso são ucmd e ucomm. Eu li mal as opções do AIX, elas podem ser especificadas com o formato do tipo printf,% a para args,% c para comm

Consulte para man psobter mais informações sobre uso e opções de formato disponíveis

A abordagem programática seria um pouco redundante, uma vez que psjá nos fornece as opções de formatação, mas isso pode ser feito awk, o que é muito útil ao lidar com saída em colunas.

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

Observe, no entanto, que esse código quebra se o nome de usuário contiver espaço em branco, por exemplo john doe. Isso pode ser alterado com a adição de uma gsubfunção que elimina seu nome de usuário da pslista. No entanto, se houver vários usuários conectados ao sistema, pode ser difícil apagar todos os nomes de usuários da saída. Assim, você pode ver que a -obandeira é muito mais preferida.

Nota lateral, sudonão é necessário para listar todos os processos comps


Obrigado! Existem diferenças entre ps -eo command& ps -eo comm? A única diferença que foi encontrado commandna saída foi tais como: [kthreadd]enquanto que na commsaída foi como este: kthreadd. Isso significa alguma coisa?
Raphael

@Raphael De acordo com a página de manual, a diferença é que commé o formato AIX, onde commandé o estilo GNU padrão. O AIX é outro sistema semelhante ao * NIX, portanto essa opção pode ser usada para compatibilidade. Caso contrário, não há diferença #
Sergiy Kolodyazhnyy 18/11/2015

@Serg, acabei de executar o diff <(ps -eo comm) <(ps -eo command)e parece haver um barulho lá embaixo, você pode esclarecer?
Andrew

Cuidado, a awksolução falha se um nome de usuário contiver espaços ( aqui ); também talvez apenas ps aux | awk '{ for(i=11;i<=NF;i++) {printf $i" "}; printf "\n" }'?
kos

2
@ Andrew Então, eu li o manual um pouco mais. Assim command, argse cmdtodos dão o comando total. De fato, a página de manual declara commande cmdé alias para args, com os -sinalizadores incluídos. O commfornece apenas o nome do exacutável. Aliases para que são ucmde ucomm. Eu mal interpretado sobre as opções AIX, aqueles podem ser realmente especificado com printf-como formato,% a para args,% c para comm
Sergiy Kolodyazhnyy

4

Uma maneira mais genérica. Nós determinamos a coluna do comando. Dessa maneira, não importa para quais opções são usadas ps.

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

Saída de amostra

% 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
[…]

E o que é isso pstree?

Saída de amostra

% 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}

[…]

Maneira mais genérica adicionada.
AB

Bravo, AB! Você resolveu o que eu e @kos estávamos tentando descobrir - eliminando o nome de usuário
Sergiy Kolodyazhnyy

1

Eu encontrei uma maneira bash de conseguir isso daqui

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

revinverte a saída pse, em seguida, corta pode ajudá-lo a delimitar o primeiro campo (que é o último!) e depois reverter novamente ...

trabalhou para mim.


2
Os processos com um espaço em seu nome não serão listados corretamente por este método: ps auxele próprio será listado como aux.
kos

1
sudonão é necessário pse o comando recorta muitos comandos; portanto, não é muito preciso; se você quiser trabalhar com colunas, use awk-o muito melhor para essa tarefa. De fato, o comando exato seriaps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'
Sergiy Kolodyazhnyy 18/11/2015

@ kos sim, eu acabei de perceber, obrigado por apontar, o Serg awkdeve trabalhar nisso.
18715 Andrew

@Serg +1, a OP havia solicitado sudo pse eu pensei awkque seria muito complicado para esta tarefa e que saiu com ela cut. De qualquer forma, você não deve atualizar sua resposta com esse código para que o OP possa aceitá-lo?
Andrew

É melhor, mas tecnicamente os nomes de usuário no Linux podem conter espaços, o que pode levar a que o comando estrague também. pssimplesmente não é cegamente analisável. Eu acho que o único método seguro aqui é ps -e -o.
kos
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.