Câu trả lời:
Các chương trình pgrep
và pidof
khô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, pidof
thấ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 program
trả 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 re
trả 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 pgrep
các tìm kiếm sử dụng các biểu thức thông thường, trong khi pidof
thì không.
Nhưng pgrep
cũ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.--parent
bạn có thể tìm thấy các quy trình con của một quy trình nhất định.--oldest
hoặc --newest
củ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