หรูหรายิ่งขึ้น“ ps aux | grep -v grep”


177

เมื่อฉันตรวจสอบรายการกระบวนการและ 'grep' กระบวนการที่น่าสนใจสำหรับฉันgrepตัวมันเองก็รวมอยู่ในผลลัพธ์ด้วย ตัวอย่างเช่นหากต้องการแสดงรายการเทอร์มินัล:

$ ps aux  | grep terminal
user  2064  0.0  0.6 181452 26460 ?        Sl   Feb13   5:41 gnome-terminal --working-directory=..
user  2979  0.0  0.0   4192   796 pts/3    S+   11:07   0:00 grep --color=auto terminal

โดยปกติฉันใช้ps aux | grep something | grep -v grepเพื่อกำจัดรายการสุดท้าย ... แต่มันก็ไม่ได้สวยงาม :)

คุณมีแฮ็คที่สง่างามกว่านี้เพื่อแก้ปัญหานี้ (นอกเหนือจากการรวมคำสั่งทั้งหมดไว้ในสคริปต์แยกต่างหากซึ่งไม่เลว)


4
สำหรับสิ่งที่คุ้มค่านี่คือคำถามที่พบบ่อยโบราณ ดูรายการ 3.10 ที่faqs.org/faqs/unix-faq/faq/part3
tripleee

1
ขอบคุณสำหรับการอ้างอิง วิธีการของพวกเขาคือ:ps ux | awk '/name/ && !/awk/ {print $2}'
Jakub M.

ตอนนี้grep -v grepทำอะไรอยู่?
Jwan622

2
@ Jwan622 grep -v grepแยกgrepออกจากผลลัพธ์ grep หากใช้ grep ร่วมกับ ps กระบวนการ grep (พร้อมอาร์กิวเมนต์ grep) จะปรากฏขึ้นเช่นกันทำให้ผลลัพธ์ของคุณยุ่งเหยิง grep -v grep เป็นวิธีทั่วไปในการหลีกเลี่ยงสิ่งนั้น
Eugene Platonov

คำตอบ:


282

เทคนิคปกติคือ:

ps aux | egrep '[t]erminal'

สิ่งนี้จะตรงกับบรรทัดที่มีterminalซึ่งegrep '[t]erminal'ไม่ได้! มันยังใช้งานได้กับUnix หลายรสชาติ


1
งานนี้สำหรับฉันสำหรับสตริงโดยพลการ ps aux | grep '[r]oot'แต่ไม่ได้สำหรับชื่อผู้ใช้เช่น ไม่มีใครรู้ว่าทำไม
kxsong

2
@kxsong: | grep '[t]erminal'เลือกบรรทัดที่มีคำว่า 'terminal' โดยไม่ใส่คำว่า 'terminal' ลงในรายการกระบวนการ คุณพยายามทำอะไรให้สำเร็จ| grep '[r]oot'และมันไม่ทำงานอย่างไร มีแนวโน้มที่จะเป็นทางออกที่ดีกว่า
Johnsyweb

3
แก้ไขฉันหากฉันผิด แต่สิ่งนี้ควรทำงานในตำแหน่งใด ๆ ของตัวละคร greipped: ps aux | grep "te [r] minal"
meso_2600

2
แฮ็คที่ยอดเยี่ยม (ฉันคิดว่าฉันควรจะเรียกมันว่าเนื่องจากผู้เขียน aux / grep อาจไม่ได้คิดถึงสถานการณ์นี้)
Michael Trouw

2
@JamieJag: อืม ... เหมือนที่ผมกล่าวในการโพสต์ของฉันจะตรงกับสายที่มีgrep '[t]erminal' terminalเอาต์พุตจากps auxจะมีบรรทัดที่มีgrep '[t]erminal'(พร้อมเครื่องหมายวงเล็บเหลี่ยม) ซึ่งไม่มีสตริงterminal(ไม่มีเหมือนกัน)
Johnsyweb

57

ใช้pgrep มันน่าเชื่อถือมากขึ้น


pgrepจะไม่ทำงานถ้าฉันมองหาตัวอย่างps aux | grep 'ssh options'
Jakub M.

12
Jakub M .: เกี่ยวกับpgrep -fอะไร
hillu

4
@ jakub-m โดยค่าเริ่มต้นpgrepจะจับคู่รูปแบบกับชื่อกระบวนการเท่านั้น เพื่อให้ตรงกับคำสั่งทั้งหมดให้ใช้-fธง
bluecollarcoder

3
pgrepส่งคืน ID กระบวนการเท่านั้น
Melab

1
รุ่นที่เก่ากว่าใช้pgrep -fl(แต่ไม่เห็น cmdline เต็มโดยไม่ต้อง-fจับคู่ cmdline เต็มรายละเอียด: serverfault.com/a/619788/44183 ) แต่ใช่ถ้าคุณต้องการข้อมูลอื่น ๆ ข้าง pid, cmdline psคุณจะต้อง สามารถรวมเข้าด้วยกัน:ps -p $(pgrep -f foo)
Beni Cherniavsky-Paskin

29

คำตอบนี้สร้างเมื่อก่อนคำตอบpgrep นอกจากนี้ยังสร้างเมื่ออีกคำตอบที่รวมการใช้งานด้วยps pgrepนี่คือตัวอย่างการฝึกอบรมที่เกี่ยวข้อง:

$ pgrep -lf sshd
1902 sshd

$ pgrep -f sshd
1902

$ ps up $(pgrep -f sshd)
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

$ ps up $(pgrep -f sshddd)
error: list of process IDs must follow p
[stderr output truncated]

$ ps up $(pgrep -f sshddd) 2>&-
[no output]

ข้างต้นสามารถใช้เป็นฟังก์ชั่น :

$ psgrep() { ps up $(pgrep -f $@) 2>&-; }

$ psgrep sshd
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

เปรียบเทียบกับการใช้กับps grepแถวส่วนหัวที่มีประโยชน์จะไม่ถูกพิมพ์:

$  ps aux | grep [s]shd
root      1902  0.0  0.1  82560  3580 ?        Ss   Oct20   0:00 /usr/sbin/sshd -D

ดูgithub.com/blueyed/oh-my-zsh/blob/… (แต่เฉพาะกับ Zsh)
blueyed

@ blueyed ฉันได้อัพเดตคำตอบด้วยนิยามฟังก์ชัน bash แล้ว
คิวเมนตัส

หมายเหตุ-dตัวเลือกเพื่อระบุตัวคั่น เช่นps -fp$(pgrep -d , getty)
Toby Speight

1
ฉันใช้สิ่งนี้: ps uxp `pgrep <process>` โปรดทราบว่าpจะต้องเป็นพารามิเตอร์สุดท้าย (เช่นpuxจะไม่ทำงาน)
KFL

9

คุณสามารถกรองคำสั่ง ps ได้เช่น

ps u -C gnome-terminal

(หรือค้นหาผ่าน / proc พร้อมค้นหาฯลฯ )


1
โปรดทราบว่าสิ่งนี้ทำงานได้กับ ps ของ GNU (Linux) แต่ไม่ใช่กับ BSD ps
Josh

สิ่งนี้ไม่ถูกต้องแม้กับ GNU ps ps -C <command>จะตรงกับคำสั่งที่แน่นอน เมื่อใช้กับaหรือxตัวเลือกมันจะรายงานกระบวนการทั้งหมดเพราะaและxรายการกระบวนการนอกเหนือไปจากชุดของกระบวนการที่ตรงกับวิธีการอื่น
Animism

@Animism True ขอบคุณฉันซ่อมมัน
Andreas Frische

ใช้ได้เฉพาะเมื่อมีการระบุชื่อกระบวนการเท่านั้น มันไม่ทำงานสำหรับการจับคู่บางส่วนเช่นlogindสำหรับsystemd-logindหรือเพื่อจับคู่ข้อโต้แย้ง
คิวเมนตัส

4

อีกหนึ่งทางเลือก :

ps -fC terminal

ตัวเลือกที่นี่:

 -f        does full-format listing. This option can be combined
           with many other UNIX-style options to add additional
           columns. It also causes the command arguments to be
           printed. When used with -L, the NLWP (number of
           threads) and LWP (thread ID) columns will be added. See
           the c option, the format keyword args, and the format
           keyword comm.

 -C cmdlist     Select by command name.
                This selects the processes whose executable name is
                given in cmdlist.

6
ข้อเสียเปรียบเล็กน้อยและข้อที่ไม่เกี่ยวข้องกับคำถามของ OP คือสิ่งนี้จะไม่แสดงให้คุณเห็นอย่าง Tomcat ซึ่งจริงๆแล้วทำงานเป็นจาวาพร้อมกับรายการข้อโต้แย้ง
Charles Wood

-Cตัวเลือกที่แนะนำแล้วใน @Andreas Frishe คำตอบของโพสต์เมื่อปีครึ่งก่อนหน้านี้ ...
Piotr Dobrogost

3

การใช้เครื่องหมายวงเล็บเพื่อล้อมอักขระในรูปแบบการค้นหาจะแยกgrepกระบวนการออกเนื่องจากไม่มี regex ที่ตรงกัน

$ ps ax | grep 'syslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18108 s001  S+     0:00.00 grep syslogd

$ ps ax | grep '[s]yslogd'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd

$ ps ax | grep '[s]yslogd|grep'
   16   ??  Ss     0:09.43 /usr/sbin/syslogd
18144 s001  S+     0:00.00 grep [s]yslogd|grep

3

คำเตือน: ฉันเป็นผู้เขียนเครื่องมือนี้ แต่ ...

ฉันจะใช้px :

~ $ px atom
  PID COMMAND          USERNAME   CPU RAM COMMANDLINE
14321 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16575 crashpad_handler walles   0.01s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Electron Framework.framework/Resources/crashpad_handler --database=
16573 Atom Helper      walles    0.5s  0% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=gpu-process --cha
16569 Atom             walles   2.84s  1% /Users/walles/Downloads/Atom.app/Contents/MacOS/Atom --executed-from=/Users/walles/src/goworkspace/src/github.com/github
16591 Atom Helper      walles   7.96s  2% /Users/walles/Downloads/Atom.app/Contents/Frameworks/Atom Helper.app/Contents/MacOS/Atom Helper --type=renderer --no-san

ยกเว้นสำหรับการหากระบวนการที่มีบรรทัดคำสั่งที่เหมาะสมอินเตอร์เฟซก็ยังไม่มากสิ่งที่มีประโยชน์อื่น ๆ รายละเอียดเพิ่มเติมได้ที่หน้าโครงการ

ใช้งานได้กับ Linux และ OS X ติดตั้งง่าย:

curl -Ls https://github.com/walles/px/raw/python/install.sh | bash

0

ขึ้นอยู่กับกรณีการใช้งานขั้นสูงสุดคุณมักจะต้องการใช้ Awk แทน

ps aux | awk '/[t]erminal/'

นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งเมื่อคุณมีสิ่งที่ชอบ

ps aux | grep '[t]erminal' | awk '{print $1}'  # useless use of grep!

โดยที่เห็นได้ชัดว่า regex สามารถแยกตัวประกอบลงในสคริปต์ Awk เล็กน้อย:

ps aux | awk '/[t]erminal/ { print $1 }'

แต่จริงๆแล้วไม่ต้องคิดค้นสิ่งใหม่นี้ด้วยตัวเอง pgrepและเพื่อน ๆ ได้อยู่เป็นเวลานานและจัดการพื้นที่ปัญหาทั้งหมดนี้ได้ดีกว่าการปรับใช้เฉพาะกิจมากที่สุด


-2

อีกตัวเลือกหนึ่งคือการแก้ไข.bash_profile(หรือไฟล์อื่น ๆ ที่คุณเก็บชื่อแทน bash ไว้) เพื่อสร้างฟังก์ชันที่ greps 'grep' ออกจากผลลัพธ์

function mygrep {
grep -v grep | grep --color=auto $1
}

alias grep='mygrep'

grep -v grepจะต้องมีครั้งแรกมิฉะนั้นคุณ--color=autoจะไม่ทำงานด้วยเหตุผลบางอย่าง

วิธีนี้ใช้ได้ผลถ้าคุณใช้ bash หากคุณใช้เชลล์ YMMV อื่น


1
อะไรคือนามแฝงและฟังก์ชั่น? เพียงแค่ทำfunction grep { command grep -v grep | command grep --color=auto "$@"; }(โปรดสังเกตการแก้ไขอาร์กิวเมนต์และข้อความ) อย่างไรก็ตามสิ่งนี้ถูกทำลายเนื่องจากการไม่psเรียกใช้ใด ๆgrepจะไม่สามารถใช้งานได้อีกต่อไป (อาร์กิวเมนต์จะถูกส่งผ่านอย่างไม่ถูกต้อง) อย่างไรก็ตามฟังก์ชั่นที่มีประโยชน์มากกว่านั้นจะเป็นฟังก์ชั่นที่ปรับเปลี่ยน regex เพื่อให้ไม่ตรงกับตัวเองแทนที่จะกรองออกgrepจากgrepผลลัพธ์แยกจากกัน และแน่นอนว่าการคิดค้นวิธีแก้ปัญหาแบบใหม่ให้กับปัญหาที่ได้รับการแก้ไขอย่างเพียงพอเมื่อหลายสิบปีก่อนนั้นไม่ได้มีประสิทธิผลมากนัก
tripleee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.