W terminalu wypisuje tylko kolumnę w polu COMMAND polecenia `ps`


12

Wiem, że możemy łatwo znaleźć następujące elementy:

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

wszystkich uruchomionych procesów za pomocą polecenia:

sudo ps aux

Moje pytanie brzmi: czy można wyświetlić wynik tylko kolumny pod COMMANDi nic więcej?

Odpowiedzi:


18

Użyj -oflagi.

Aby wyświetlić listę tylko własnych procesów

 ps -o command  

Aby wyświetlić listę wszystkich procesów systemowych

 ps -e -o command

Nie jest to jedyny sposób wyświetlania poleceń, mogą być drukowane z flagami wiersza poleceń lub tylko jako pliki wykonywalne (co commandrobi ta opcja).

Z mojego komentarza poniżej odpowiedź:

polecenia, argumenty i cmd dają pełne polecenie. W rzeczywistości polecenia man page Stany i cmd są aliasami argumentów, z dołączonymi flagami. Comm podaje tylko nazwę egzacutable. Pseudonimy to ucmd i ucomm. Źle przeczytałem o opcjach systemu AIX, można je określić za pomocą formatu podobnego do printf,% a dla argumentów,% c dla komunikatora

Patrz man psuzyskać więcej informacji na temat użytkowania i dostępnych opcji formatowania

Podejście programowe byłoby nieco zbędne, ponieważ psjuż zapewnia nam opcje formatowania, ale można to zrobić awk, co jest bardzo przydatne, gdy mamy do czynienia ze skumulowanymi danymi wyjściowymi.

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

Należy jednak pamiętać, że ten kod łamie się, jeśli nazwa użytkownika zawiera spacje, np john doe. Można to zmienić, dodając gsubfunkcję, która usunie twoją nazwę użytkownika z pslisty. Jeśli jednak do systemu zalogowanych jest wielu użytkowników, usunięcie wszystkich nazw użytkowników z danych wyjściowych może być trudne. W ten sposób widać, że -oflaga jest znacznie bardziej preferowana.

Uwaga dodatkowa: sudonie jest konieczne wylistowanie wszystkich procesówps


Dziękuję Ci! Czy są jakieś różnice między ps -eo command& ps -eo comm? Jedyną różnicą znalazłem w commandwyjście było jako takie: [kthreadd]podczas gdy w commwyjście było jak ten: kthreadd. Czy to coś znaczy?
Raphael,

@Raphael według strony podręcznika, różnica polega na tym, że commjest to format AIX, gdzie podobnie jak commandstandardowy format GNU. AIX jest kolejnym systemem podobnym do * NIX, więc można użyć tej opcji dla zapewnienia zgodności. W przeciwnym razie nie ma różnicy
Sergiy Kolodyazhnyy

@Serg, właśnie wykonałem diff <(ps -eo comm) <(ps -eo command)i wydaje się, że jest tam dość grzechotka, czy możesz to wyjaśnić?
Andrew,

Uważaj, awkrozwiązanie psuje się, jeśli nazwa użytkownika zawiera spacje ( tutaj ); też może po prostu ps aux | awk '{ for(i=11;i<=NF;i++) {printf $i" "}; printf "\n" }'?
Kos

2
@Andrew Więc przeczytałem trochę więcej instrukcji. Tak command, argsi cmdwszystkie dają pełną kontrolę. W rzeczywistości strona man stanów commandi cmdsą aliasy args, z -flagami zawartych. commPodaje nazwę tylko exacutable. Pseudonimy to ucmdi ucomm. Źle przeczytałem o opcjach systemu AIX, można je tak naprawdę określić za pomocą formatu podobnego do printf,% a dla argumentów,% c dla komunikatora
Sergiy Kolodyazhnyy

4

Bardziej ogólny sposób. Określamy kolumnę polecenia. W ten sposób nie ma znaczenia, które przełączniki są używane ps.

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

Próbka wyjściowa

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

I co o pstree?

Próbka wyjściowa

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

[…]

Dodano bardziej ogólny sposób.
AB

Bravo, AB! Rozwiązałeś to, co ja i @kos próbowaliśmy rozgryźć - eliminując nazwę użytkownika
Sergiy Kolodyazhnyy

1

Znalazłem odważny sposób na osiągnięcie tego stąd

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

revodwraca dane wyjściowe, psa następnie wycinanie może pomóc ci wytyczyć pierwsze pole (które jest ostatnie!), a następnie odwrócić je ponownie ...

pracował dla mnie.


2
Procesy ze spacją w nazwie nie będą poprawnie wyświetlane na liście za pomocą tej metody: ps auxsamo będzie na liście jako aux.
Kos

1
sudonie jest konieczne, psa polecenie przycina wiele poleceń, więc nie jest zbyt dokładne, jeśli chcesz pracować z kolumnami, użyj awkgo znacznie lepiej do tego zadania. W rzeczywistości dokładne polecenie ps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'
brzmiałoby

@ Kos tak, właśnie zdałem sobie z tego sprawę, dziękuję za zwrócenie uwagi, Serg awkpowinien to załatwić .
Andrew

@Erg +1, OP poprosił sudo psi pomyślałem awk, że będzie to zbyt skomplikowane do tego zadania i wyszło cut. W każdym razie, czy nie powinieneś zaktualizować swojej odpowiedzi tym kodem, aby PO mógł ją zaakceptować?
Andrew,

Jest lepiej, ale technicznie nazwy użytkowników w Linuksie mogą zawierać spacje, co może również prowadzić do bałaganu w tym poleceniu. pspo prostu nie można go ślepo przetwarzać. Myślę, że jedyną bezpieczną metodą jest tutaj ps -e -o.
Kos
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.