Câu trả lời:
ps auxbao 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 auxtrả về dòng lệnh đầy đủ của mỗi quá trình, trong khi pgrepchỉ 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.plpgrep php5sẽ 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 pythonchỉ 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>/statnhư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
pgrepkhô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 pgrepcho điều đó. Việc sử dụng ps aux | grep xxxlà không đáng tin cậy vì vậy cần hack để tự lọc ra grepkhỏ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 xlệnh cho kết quả "tốt hơn" pgrep xvề 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 -ftù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 | grepxâ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, pgrepsẽ 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 USERcột, bạn sẽ nhận được các quy trình không mong muốn ở đầu ra, pgrepkhô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/cmdlinethành "mô tả", pgrep -fa rubysẽ 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 rubysẽ. Không chắc chắn sau này có thể bị lừa quá.
pgrepvà ps.
diff <(ps aux|grep x) <(pgrep x) # :)
Tại thời điểm này, pssẽ cung cấp đầu ra đầy đủ hơn pgep -fvì 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