Câu trả lời:
Các chương trình pgrepvà pidofkhông hoàn toàn giống nhau, nhưng chúng rất giống nhau. Ví dụ:
$ pidof 'firefox'
5696
$ pgrep '[i]ref'
5696
$ pidof '[i]ref'
$ printf '%s\n' "$?"
1
Như bạn có thể thấy, pidofthất bại trong việc tìm kiếm một trận đấu cho [i]ref. Điều này là do pidof programtrả về một danh sách tất cả các ID tiến trình được liên kết với một chương trình được gọi program. Mặt khác, pgrep retrả về một danh sách tất cả các ID tiến trình được liên kết với một chương trình có tên khớp với biểu thức chính quy re.
Trong các hình thức cơ bản nhất của chúng, sự tương đương thực sự là:
$ pidof 'program'
$ pgrep '^program$'
Như một ví dụ cụ thể khác, hãy xem xét:
$ 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 đã đề cập rằng pgrepcác tìm kiếm sử dụng các biểu thức thông thường, trong khi pidofthì không.
Nhưng pgrepcũng có nhiều tùy chọn hơn có sẵn:
-u "$UID"bạn chỉ có thể khớp các quy trình thuộc về người dùng hiện tại.--parentbạn có thể tìm thấy các quy trình con của một quy trình nhất định.--oldesthoặc --newestcủa các quá trình phù hợp.Hãy tìm hiểu xem mỗi quy trình thuộc về gói nào (trên các hệ thống apt):
$ dpkg -S "$(which pidof)"
sysvinit-utils: /bin/pidof
$ dpkg -S "$(which pgrep)"
procps: /usr/bin/pgrep