Chỉ xuất ra cột dưới lệnh của lệnh `ps` trong terminal


12

Tôi biết rằng chúng ta có thể dễ dàng tìm thấy như sau:

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

của tất cả các quy trình đang chạy bằng cách sử dụng lệnh:

sudo ps aux

Câu hỏi của tôi là, có thể hiển thị đầu ra của cột chỉ COMMANDvà không có gì khác không?

Câu trả lời:


18

Sử dụng -ocờ.

Chỉ liệt kê các quy trình của riêng bạn

 ps -o command  

Để liệt kê tất cả các quy trình hệ thống

 ps -e -o command

Đây không phải là cách duy nhất để liệt kê các lệnh, chúng có thể được in bằng cờ dòng lệnh hoặc chỉ có thể thực thi được (đó là commandtùy chọn nào).

Từ nhận xét của tôi dưới đây câu trả lời:

lệnh, args và cmd đều cung cấp lệnh đầy đủ. Trong thực tế trang man trạng thái lệnh và cmd là bí danh cho args, với các cờ - bao gồm. Các comm chỉ cho tên của exacutable. Bí danh cho đó là ucmd và ucomm. Tôi đã đọc sai về các tùy chọn AIX, chúng có thể được chỉ định thực sự với định dạng giống như printf,% a cho args,% c cho comm

Tham khảo để man psbiết thêm thông tin về cách sử dụng và các tùy chọn định dạng có sẵn

Cách tiếp cận theo chương trình sẽ là một chút dư thừa, vì psđã cung cấp cho chúng ta các tùy chọn định dạng, nhưng nó có thể được thực hiện awk, rất hữu ích khi xử lý đầu ra được cột.

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

Tuy nhiên, lưu ý rằng mã này bị hỏng nếu tên người dùng chứa khoảng trắng, vd john doe. Điều này có thể được sửa đổi bằng cách thêm gsubchức năng sẽ loại bỏ tên người dùng của bạn khỏi psdanh sách. Tuy nhiên, nếu có nhiều người dùng đăng nhập vào hệ thống, điều đó có thể khó thực hiện sai tất cả tên người dùng từ đầu ra. Vì vậy, bạn có thể thấy rằng -ocờ được ưa thích hơn nhiều.

Lưu ý bên, sudokhông cần thiết để liệt kê tất cả các quy trình vớips


Cảm ơn bạn! Có sự khác biệt nào giữa ps -eo command& ps -eo comm? Sự khác biệt duy nhất tôi tìm thấy là ở commandđầu ra là như vậy: [kthreadd]trong khi ở commđầu ra là như sau : kthreadd. Điều này có ý nghĩa gì không?
Raphael

@Raphael theo trang man, sự khác biệt là commđịnh dạng AIX, trong đó commandlà định dạng kiểu GNU tiêu chuẩn. AIX là một hệ thống giống như * NIX khác, do đó tùy chọn đó có thể được sử dụng cho khả năng tương thích.
Mặt

@Serg, tôi vừa mới thực hiện diff <(ps -eo comm) <(ps -eo command)và dường như có một tiếng rít ở dưới đó, bạn có thể làm rõ?
Andrew

Xem ra, awkgiải pháp phá vỡ nếu tên người dùng chứa khoảng trắng ( ở đây ); cũng có thể chỉ ps aux | awk '{ for(i=11;i<=NF;i++) {printf $i" "}; printf "\n" }'?
kos

2
@Andrew Vì vậy, tôi đã đọc hướng dẫn thêm một chút. Vì vậy command, argscmdtất cả đưa ra mệnh lệnh đầy đủ. Trong thực tế trang man trạng thái commandcmdlà bí danh cho args, với các -cờ bao gồm. Tên commcho chỉ của exacutable. Bí danh cho điều đó là ucmducomm. Tôi đã đọc sai về các tùy chọn AIX, những tùy chọn này thực sự có thể được chỉ định với định dạng giống như printf,% a cho args,% c cho comm
Sergiy Kolodyazhnyy

4

Một cách chung chung hơn. Chúng tôi xác định cột của lệnh. Theo cách này, việc chuyển đổi được sử dụng cho mục đích gì không quan trọng ps.

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

Sản lượng mẫu

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

Và những gì về pstree?

Sản lượng mẫu

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

[…]

Cách chung hơn được thêm vào.
AB

Bravo, AB! Bạn đã giải quyết những gì tôi và @kos đang cố gắng tìm ra - loại bỏ tên người dùng
Sergiy Kolodyazhnyy

1

Tôi tìm thấy một cách bashy để đạt được điều này từ đây

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

revđảo ngược đầu ra psvà sau đó cắt có thể giúp bạn phân định trường đầu tiên (là trường cuối cùng!) và sau đó đảo ngược lại ...

đã làm cho tôi.


2
Các quy trình có một khoảng trắng trong tên của chúng sẽ không được liệt kê chính xác theo phương pháp này: ps auxchính nó sẽ được liệt kê dưới dạng aux.
kos

1
sudokhông cần thiết psvà lệnh cắt rất nhiều lệnh, vì vậy nó không chính xác lắm, nếu bạn muốn làm việc với colums, hãy sử dụng awknó tốt hơn cho nhiệm vụ đó. Trên thực tế, mệnh lệnh chính xác sẽ làps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'
Sergiy Kolodyazhnyy

@kos yeah, tôi mới nhận ra điều đó, cảm ơn vì đã chỉ ra, Serg awknên làm việc đó.
Andrew

@Serg +1, OP đã yêu cầu sudo psvà tôi nghĩ awksẽ quá phức tạp cho nhiệm vụ này và đã xuất hiện cut. Dù sao, bạn không nên cập nhật câu trả lời của mình với mã đó để OP có thể chấp nhận nó?
Andrew

Tốt hơn, nhưng về mặt kỹ thuật, tên người dùng trên Linux có thể chứa khoảng trắng, điều này cũng có thể khiến lệnh đó bị rối. psnó chỉ không thể phân tích một cách mù quáng. Tôi nghĩ rằng phương pháp an toàn duy nhất ở đây là ps -e -o.
kos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.