ฉันเพิ่งลองคำสั่งต่อไปนี้บน Ubuntu ของฉันมันไม่แสดงอะไรเลย:
pgrep php5
มันไม่ควรจะส่งคืน ID กระบวนการของ php5 (ซึ่งคำสั่งต่อไปนี้จะทำได้):
ps aux | grep php5
ดังนั้นคำสั่งสองคำนี้แตกต่างกันอย่างไร
ฉันเพิ่งลองคำสั่งต่อไปนี้บน Ubuntu ของฉันมันไม่แสดงอะไรเลย:
pgrep php5
มันไม่ควรจะส่งคืน ID กระบวนการของ php5 (ซึ่งคำสั่งต่อไปนี้จะทำได้):
ps aux | grep php5
ดังนั้นคำสั่งสองคำนี้แตกต่างกันอย่างไร
คำตอบ:
ps aux
รวมบรรทัดคำสั่งแบบเต็ม (พา ธ และพารามิเตอร์) ในขณะที่ pgrep จะดูเฉพาะอักขระ 15 ตัวแรกของชื่อไฟล์ที่เรียกทำงานได้ps aux
ส่งคืนบรรทัดคำสั่งแบบเต็มของแต่ละกระบวนการในขณะที่pgrep
ดูเฉพาะชื่อของไฟล์เรียกทำงาน
นั่นหมายความว่าการส่งออกgrepping ps aux
จะตรงกับสิ่งที่เกิดขึ้นในเส้นทางหรือพารามิเตอร์ของไบนารี 'กระบวนการ: เช่น'
ps aux | grep php5
จะจับคู่ /usr/share/php5/i-am-a-perl-script.pl
pgrep php5
จะไม่นำตัวอย่างจากระบบของฉัน - เราเท่านั้นที่จะใช้ python แทนphp5
:
ps aux | grep python
ให้เรา:izx 2348 0.0 0.7 514928 15644? Sl Jun24 0:00 / usr / bin / python / usr / lib / unity-lens-video / unity-lens-video izx 2444 0.0 0.9 547392 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote ราก 2805 0.0 0.5 95436 12204 S Jun24 0:00 / usr / bin / python / usr / lib / ระบบบริการ / system-service-d izx 6272 0.0 2.9 664400 60320? SNl Jun24 1:16 / usr / bin / python / usr / bin / update-manager - ไม่มีโฟกัสบนแผนที่ ราก 11729 0.0 0.9 180508 19516 S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
pgrep python
ผลตอบแทนเท่านั้น11729
ซึ่งคุณจะเห็นจากรายการด้านบนคือ:ราก 11729 0.0 0.9 180508 19516 S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
/proc/<pid>/stat
/proc/<pid>/cmdline
แต่ไม่ได้มาจาก ตกลง @Thorsen คุณชนะสเปรย์บั๊กมันเป็นข้อผิดพลาด: P
pgrep
ไม่ใช่คำสั่งที่ไม่สมเหตุสมผล มันทำงานได้ดีและได้รับการออกแบบ ปัญหาคือว่าคุณไม่มีตัวเลือกเมื่อคุณรันคุณไม่สามารถตำหนิpgrep
ได้ ใช้ps aux | grep xxx
เป็นที่ไม่น่าเชื่อถือจึงต้อง hacks จะกรองออกจากตัวเองจากการออกและอาจให้ผลบวกปลอมเช่นเดียวกับgrep
ps aux | grep root
ps aux | grep x
คำสั่งให้ "ดี" ผลกว่าpgrep x
เป็นหลักเพราะคุณจะหายไปตัวเลือกที่มีต่อ ๆ
เพียงใช้-f
ตัวเลือกสำหรับpgrep
การค้นหาบรรทัดคำสั่งแบบเต็มและไม่เพียง แต่ชื่อกระบวนการซึ่งเป็นพฤติกรรมเริ่มต้นเช่น:
pgrep -f php5
ไม่เหมือนกับสิ่งps | grep
ก่อสร้างที่คุณต้องการกรองgrep
เส้นหรือใช้ลูกเล่นลวดลายpgrep
เพียง แต่จะไม่เลือกด้วยตัวเองโดยการออกแบบ
ยิ่งไปกว่านั้นหากรูปแบบของคุณปรากฏในps
USER
คอลัมน์คุณจะได้รับกระบวนการที่ไม่พึงประสงค์ในผลลัพธ์pgrep
ไม่ประสบกับข้อบกพร่องนี้
หากคุณต้องการรายละเอียดทั้งหมดแทนที่จะเป็นเพียงแค่ pids คุณสามารถใช้:
ps wup $(pgrep -f python)
ซึ่งง่ายกว่าและเชื่อถือได้มากกว่า
ps aux | grep python | grep -v grep
หรือ
ps aux | grep p[y]thon
-a
( --list-full
) ด้วยหากคุณต้องการดูบรรทัดคำสั่งแบบเต็มไม่ใช่เฉพาะ pid (pgrep เก่าไม่มี-a
, ทำอย่างนี้บน-fl
.)
pgrep
จะเล่นได้ดีในการแก้ปัญหา +1
/proc/self/cmdline
ให้เป็น "คำอธิบาย" pgrep -fa ruby
จะไม่ตรงกันเช่น puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
ในขณะที่ "โง่" pgrep -a ruby
จะ ไม่แน่ใจว่าหลังอาจถูกหลอกเกินไป
pgrep
ps
diff <(ps aux|grep x) <(pgrep x) # :)
ในเวลานี้ps
จะให้ผลลัพธ์ที่สมบูรณ์มากขึ้นกว่าpgep -f
ที่ pgrep จะถูก จำกัด ที่ 4,096 ตัวอักษรแรก (มักจะส่งผลกระทบต่อผู้ใช้ Java ที่กำลังมองหารายการระดับของโปรแกรม Java ที่มี classpath ยาว) ข้อผิดพลาดในการติดตามคือ: https://gitlab.com/procps-ng/procps/issues/86