ฉันเพิ่งลองคำสั่งต่อไปนี้บน 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.plpgrep 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