Câu trả lời:
ps aux
bao gồm dòng lệnh đầy đủ (đường dẫn và tham số), trong khi pgrep chỉ nhìn vào 15 ký tự đầu tiên của tên thực thips aux
trả về dòng lệnh đầy đủ của mỗi quá trình, trong khi pgrep
chỉ nhìn vào tên của các tệp thực thi.
Điều đó có nghĩa là đầu ra grepping ps aux
sẽ khớp với bất kỳ thứ gì xảy ra trong đường dẫn hoặc các tham số của nhị phân của một tiến trình: vd
ps aux | grep php5
sẽ phù hợp /usr/share/php5/i-am-a-perl-script.pl
pgrep php5
sẽ khôngLấy một ví dụ từ hệ thống của tôi - chỉ chúng tôi sẽ sử dụng python thay vì php5
:
ps aux | grep python
cho chúng tôi: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 54792 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote gốc 2805 0,0 0,5 95436 12204? S Jun24 0:00 / usr / bin / python / usr / lib / system-service / system-service-d izx 6272 0,0 2.9 664400 60320? SNl Jun24 1:16 / usr / bin / python / usr / bin / update-manager --no-Focus-on-map gốc 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-property / software-property-dbus
pgrep python
chỉ trả về 11729
, mà bạn sẽ thấy từ danh sách trên là:gốc 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-property / software-property-dbus
/proc/<pid>/stat
nhưng không phải từ/proc/<pid>/cmdline
. OK, @Thorsen, bạn thắng bình xịt lỗi, đó là một lỗi: P
pgrep
không phải là một mệnh lệnh vô lý. Nó hoạt động tốt và như thiết kế. Vấn đề chỉ đơn giản là bạn đã thiếu một tùy chọn khi bạn chạy nó, bạn không thể đổ lỗi pgrep
cho điều đó. Việc sử dụng ps aux | grep xxx
là không đáng tin cậy vì vậy cần hack để tự lọc ra grep
khỏi đầu ra và có thể đưa ra kết quả dương tính giả như với ps aux | grep root
.
Các ps aux | grep x
lệnh cho kết quả "tốt hơn" pgrep x
về cơ bản bởi vì bạn đang thiếu một tùy chọn với sau này.
Chỉ cần sử dụng -f
tùy chọn pgrep
để tìm kiếm dòng lệnh đầy đủ và không chỉ tên quy trình là hành vi mặc định của nó, ví dụ:
pgrep -f php5
Không giống như việc ps | grep
xây dựng mà bạn cần lọc ra grep
đường hoặc sử dụng các thủ thuật mẫu, pgrep
sẽ không tự chọn theo thiết kế.
Hơn nữa, nếu mẫu của bạn xuất hiện trong ps
USER
cột, bạn sẽ nhận được các quy trình không mong muốn ở đầu ra, pgrep
không bị lỗ hổng này.
Nếu bạn muốn chi tiết đầy đủ thay vì chỉ các pids, bạn có thể sử dụng:
ps wup $(pgrep -f python)
đơn giản và đáng tin cậy hơn
ps aux | grep python | grep -v grep
hoặc là
ps aux | grep p[y]thon
-a
( --list-full
) nếu bạn muốn xem dòng lệnh đầy đủ và không chỉ pid. (Các pgrep cũ hơn không có -a
, đã làm điều này vào-fl
.)
pgrep
để chơi tốt giải pháp. +1
/proc/self/cmdline
thành "mô tả", pgrep -fa ruby
sẽ không khớp với ví dụ. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
, trong khi "thợ lặn" pgrep -a ruby
sẽ. Không chắc chắn sau này có thể bị lừa quá.
pgrep
và ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
Tại thời điểm này, ps
sẽ cung cấp đầu ra đầy đủ hơn pgep -f
vì pgrep bị giới hạn ở 4.096 ký tự đầu tiên (thường ảnh hưởng đến người dùng Java đang tìm kiếm lớp nhập của chương trình Java với đường dẫn dài). Theo dõi lỗi này là: https://gitlab.com/procps-ng/procps/issues/86