เอาต์พุตเฉพาะคอลัมน์ภายใต้ 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ตัวเลือกที่ทำ)

จากความคิดเห็นของฉันตะโกนคำตอบ:

คำสั่ง args และ cmd ทั้งหมดให้คำสั่งแบบเต็ม ในความเป็นจริงคำสั่ง man page states และ cmd เป็น alias สำหรับ args โดยมี - แฟล็กรวมอยู่ คอมมิชชันให้ชื่อของ exacutable เท่านั้น นามแฝงกับ ucmd และ ucomm ฉันเข้าใจผิดเกี่ยวกับตัวเลือกของ AIX สิ่งเหล่านั้นสามารถระบุได้จริงด้วยรูปแบบเหมือน printf,% a สำหรับ args,% c สำหรับการสื่อสาร

อ้างถึง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

@Raphael ตาม man page ความแตกต่างคือcommรูปแบบ AIX โดยที่เป็นcommandรูปแบบสไตล์ GNU มาตรฐาน AIX เป็นอีก * NIX เช่นระบบดังนั้นตัวเลือกนั้นอาจถูกใช้เพื่อความเข้ากันได้ มิฉะนั้นจะไม่มีความแตกต่าง
Sergiy Kolodyazhnyy

@ เซอร์ฉันเพิ่งจะประหารชีวิตdiff <(ps -eo comm) <(ps -eo command)และดูเหมือนว่าจะมีเสียงสั่นสะเทือนอยู่ตรงนั้นคุณช่วยอธิบายได้ไหม?
แอนดรู

ระวังawkวิธีแก้ปัญหาถ้าชื่อผู้ใช้มีช่องว่าง ( ที่นี่ ); อาจจะยังแค่ps aux | awk '{ for(i=11;i<=NF;i++) {printf $i" "}; printf "\n" }'?
คอส

2
@ แอนดรูว์ฉันอ่านคู่มืออีกหน่อย ดังนั้นcommand, argsและcmdทุกคำสั่งให้เต็มรูปแบบ ในความเป็นจริงรัฐหน้าคนcommandและcmdเป็นชื่อแทนargsโดยมี-ธงรวมอยู่ commทำให้ชื่อของ exacutable เท่านั้น นามแฝงของการที่มีและucmd ucommฉันเข้าใจผิดเกี่ยวกับตัวเลือกของ AIX สิ่งเหล่านั้นสามารถระบุได้จริงด้วยรูปแบบเหมือน printf,% a สำหรับ args,% c สำหรับการสื่อสาร
Sergiy Kolodyazhnyy

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 พยายามคิดออก - กำจัดชื่อผู้ใช้
Sergiy Kolodyazhnyy

1

ฉันพบหนทางที่จะบรรลุเป้าหมายนี้จากที่นี่

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

revฝืนเอาท์พุทของpsและจากนั้นการตัดสามารถช่วยคุณในการกำหนดเขตข้อมูลแรก (ซึ่งเป็นครั้งสุดท้าย!) แล้วย้อนกลับอีกครั้ง ...

ทำงานให้ฉัน


2
กระบวนการที่มีพื้นที่อยู่ในชื่อของพวกเขาจะไม่ได้รับการจดทะเบียนอย่างถูกต้องตามวิธีนี้: ตัวเองจะถูกระบุว่าเป็นps aux aux
kos

1
sudoไม่จำเป็นpsและคำสั่งครอบตัดคำสั่งจำนวนมากดังนั้นมันจึงไม่แม่นยำมากหากคุณต้องการทำงานกับ colums ให้ใช้awkมันดีกว่าสำหรับงานนั้น ในความเป็นจริงคำสั่งที่แน่นอนจะเป็นps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'
Sergiy Kolodyazhnyy

@ kos ใช่ฉันเพิ่งรู้ว่าขอบคุณที่ชี้ให้เห็นว่า Serg awkควรทำงานได้
แอนดรู

@Serg +1 OP ได้รับการร้องขอsudo psและฉันคิดว่าจะมีความซับซ้อนเกินไปสำหรับงานนี้และออกมาพร้อมกับawk cutอย่างไรก็ตามคุณไม่ควรอัปเดตคำตอบของคุณด้วยรหัสนั้นเพื่อให้ OP ยอมรับได้หรือไม่
แอนดรู

ดีกว่า แต่ชื่อผู้ใช้ทางเทคนิคบน Linux สามารถมีช่องว่างได้ซึ่งอาจทำให้คำสั่งนั้นสับสนเช่นกัน psมันไม่แยกวิเคราะห์สุ่มสี่สุ่มห้า ps -e -oผมคิดว่าวิธีการที่ปลอดภัยเฉพาะที่นี่คือ
kos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.