Виведіть у терміналі лише стовпець під командою COMMAND команди `ps`


12

Я знаю, що ми можемо легко знайти наступне:

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

всіх запущених процесів за допомогою команди:

sudo ps aux

Моє, питання в тому, чи можна показати вихід лише стовпця під COMMANDі нічого іншого?

Відповіді:


18

Використовуйте -oпрапор.

Перелічити лише власні процеси

 ps -o command  

Щоб перелічити всі системні процеси

 ps -e -o command

Це не єдиний спосіб перелічити команди, вони можуть бути надруковані прапорами командного рядка, або лише як виконувані файли (що таке commandопція).

З мого коментаря нижче відповіді:

команда, аргументи та cmd всі дають повну команду. Насправді команда man page stanja і cmd є псевдонімами для аргументів, включаючи - прапори. Команда дає назву виключно гострим. Псевдоніми до цього є ucmd та ucomm. Я неправильно читав про параметри AIX, їх можна фактично вказати у форматі printf,% a для аргументів,% c для comm

Докладнішу man psінформацію про використання та доступні опції формату див

Програмний підхід був би дещо зайвим, оскільки psвже надає нам параметри форматування, але це можна зробити awk, що дуже корисно при роботі з колонкованим результатом.

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

Зауважте, що цей код порушується, якщо ім'я користувача містить пробіли, наприклад john doe. Це можна змінити, додавши gsubфункцію, яка вилучить ваше ім'я користувача зі psсписку. Однак, якщо в систему ввійшло кілька користувачів, може бути складно помилити всі імена користувачів з виводу. Таким чином, ви можете бачити, що -oпрапор набагато переважніший.

Бічна примітка, sudoне потрібна для переліку всіх процесівps


Дякую! Чи є різниці між ps -eo command& ps -eo comm? Єдина відмінність я знайшов в commandвихідний був такий: в [kthreadd]той час як в commвихідний був , як це: kthreadd. Чи означає це щось?
Рафаель

@Raphael відповідно до сторінки man, різниця полягає в тому, що commце AIX формат, де, як commandі стандартний формат стилю GNU. AIX - це ще одна система, схожа на NIX, тому ця опція може бути використана для сумісності. Інакше різниці немає
Сергій Колодяжний

@ Серг, я щойно виконав, diff <(ps -eo comm) <(ps -eo command)і там, здається, є досить брязкальце, ви можете уточнити?
Андрій

Слідкуйте, awkрішення розривається, якщо ім’я користувача містить пробіли ( тут ); також, можливо, просто ps aux | awk '{ for(i=11;i<=NF;i++) {printf $i" "}; printf "\n" }'?
kos

2
@Andrew Отже, я почитав посібник ще трохи. Отже command, argsі cmdвсі віддають повну команду. Насправді сторінка man повідомляє commandі cmdє псевдонімами args, з -включеними прапорцями Ім'я commдає назву тільки невиправданим. Псевдоніми до цього є ucmdі ucomm. Я неправильно читаю про параметри AIX, їх можна фактично вказати у форматі printf,% a для аргументів,% c для comm
Сергій Колодяжний

4

Більш родовий спосіб. Визначаємо стовпчик команди. Таким чином, не має значення, для яких вимикачів використовуються ps.

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

Вибірка зразка

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

А про що pstree?

Вибірка зразка

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

[…]

Додано ще загальний спосіб.
AB

Браво, AB! Ви вирішили те, що я і @kos намагалися з'ясувати - усуваючи ім'я користувача
Сергій Колодяжний

1

Я знайшов грізний спосіб досягти цього звідси

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

revповертає результат psі потім вирізати допоможе вам розмежувати перше поле (яке є останнім!), а потім повернути його знову ...

працював на мене.


2
Процеси з пробілом у їх імені не будуть вказані правильно цим методом: ps auxсам буде вказаний як aux.
kos

1
sudoне потрібно, psі команда обробляє багато команд, тому це не дуже точно, якщо ви хочете працювати з колонками, використовуйте awkце набагато краще для цього завдання. Насправді точна команда була бps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'
Сергій Колодяжний

@kos так, я щойно зрозумів це, дякую, що вказав на це, Серг awkповинен працювати.
Андрій

@ Серг +1, ОП попросив, sudo psі я подумав, awkщо це завдання буде занадто складним, і я вийшов cut. У будь-якому випадку, чи не слід оновлювати свою відповідь цим кодом, щоб ОП може прийняти її?
Андрій

Це краще, але технічно імена користувачів в Linux можуть містити пробіли, що може призвести до того, що ця команда також зіпсується. psце просто не сліпо розбирається. Я думаю, єдиний безпечний метод тут ps -e -o.
кос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.