เมื่อฉันใช้คำสั่งเหล่านี้อย่างใดอย่างหนึ่งกับอาร์กิวเมนต์เป็นชื่อของกระบวนการพวกเขาทั้งสองกลับหมายเลขเดียวกันแน่นอน พวกเขาเป็นคำสั่งเดียวกันหรือไม่ พวกเขาสองคำสั่งต่างกันที่ทำสิ่งเดียวกัน เป็นหนึ่งในนั้นนามแฝงอื่น ๆ ?
pidof firefox
pgrep firefox
เมื่อฉันใช้คำสั่งเหล่านี้อย่างใดอย่างหนึ่งกับอาร์กิวเมนต์เป็นชื่อของกระบวนการพวกเขาทั้งสองกลับหมายเลขเดียวกันแน่นอน พวกเขาเป็นคำสั่งเดียวกันหรือไม่ พวกเขาสองคำสั่งต่างกันที่ทำสิ่งเดียวกัน เป็นหนึ่งในนั้นนามแฝงอื่น ๆ ?
pidof firefox
pgrep firefox
คำตอบ:
โปรแกรมpgrepและpidofไม่ใช่สิ่งเดียวกัน แต่คล้ายกันมาก ตัวอย่างเช่น:
$ pidof 'firefox'
5696
$ pgrep '[i]ref'
5696
$ pidof '[i]ref'
$ printf '%s\n' "$?"
1
อย่างที่คุณเห็นpidofไม่สามารถหาคู่ที่ตรงกัน[i]refได้ เพราะนี่คือผลตอบแทนที่รายการของรหัสกระบวนการทั้งหมดที่เกี่ยวข้องกับโปรแกรมที่เรียกว่าpidof program programบนมืออื่น ๆ ที่กลับรายการของรหัสกระบวนการทั้งหมดที่เกี่ยวข้องกับโปรแกรมที่มีชื่อตรงกับการแสดงออกปกติpgrep rere
ในรูปแบบพื้นฐานที่สุดความเท่ากันจริง:
$ pidof 'program'
$ pgrep '^program$'
เป็นอีกตัวอย่างที่เป็นรูปธรรมพิจารณา:
$ ps ax | grep '[w]atch'
12 ? S 0:04 [watchdog/0]
15 ? S 0:04 [watchdog/1]
33 ? S< 0:00 [watchdogd]
18451 pts/5 S+ 0:02 watch -n600 tail log-file
$ pgrep watch
12
15
33
18451
$ pidof watch
18451
Fox ได้กล่าวไว้ว่าpgrepการค้นหาโดยใช้นิพจน์ทั่วไปในขณะที่pidofไม่แสดง
แต่pgrepยังมีตัวเลือกเพิ่มเติมมากมาย:
-u "$UID"คุณสามารถจับคู่เฉพาะกระบวนการที่เป็นของผู้ใช้ปัจจุบัน--parentคุณสามารถค้นหากระบวนการลูกของกระบวนการที่กำหนด--oldestหรือ--newestกระบวนการที่ตรงกันมาดูกันว่าแต่ละแพ็คเกจนั้นเป็นของกระบวนการใด (บนระบบ apt):
$ dpkg -S "$(which pidof)"
sysvinit-utils: /bin/pidof
$ dpkg -S "$(which pgrep)"
procps: /usr/bin/pgrep