Tại sao không có ps ps | grep xiêu cho kết quả tốt hơn so với pgrep xv?


82

Tôi vừa thử lệnh sau trên Ubuntu, nó không hiển thị một điều:

pgrep php5

không nên trả về id tiến trình của php5 (lệnh sau chỉ thực hiện)?:

ps aux | grep php5

Vì vậy, sự khác biệt giữa hai lệnh này là gì?

Câu trả lời:


75

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 thi

ps 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.pl
  • nhưng pgrep php5sẽ không

Lấ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
  • Nhưng 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

3
"pgrep -l" cũng cắt bớt quá trình thành 15 ký tự, đây có thể là một lỗi nhưng đã xảy ra như thế này từ lâu
Thorsen

1
Chà, trong launchpad là một lỗi ngược dòng vào năm 2008 :) "lệnh cắt ngắn và ps sau 15 ký tự" bug.launchpad.net/ubfox/+source/procps/+bug/295876
Thorsen

2
Hah, điều này giải thích nó, từ nhận xét # 3: Điều này là do thực tế là một số thủ tục của procs có được tên lệnh từ /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
ish

2
@xczzhh 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.
jlliagre

1
Điều này nên có trong một quảng cáo chống ma túy, những người tạo ra các công cụ bash đã rất rạo rực trên LSD, họ nghĩ rằng những thứ như thế này được thiết kế tốt
Andy Ray

78

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

3
Đồng thời thêm tùy chọn -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 .)
Beni Cherniavsky-Paskin

1
Câu hỏi ban đầu là hỏi về sự khác biệt nhưng điều này thực sự mang lại cho những người trong chúng ta đang cố gắng pgrepđể chơi tốt giải pháp. +1
2rs2ts

@ 2rs2ts Cảm ơn, tôi thực sự đã mất tích để trả lời cho câu hỏi được hỏi. Đã sửa bây giờ.
jlliagre

Trong một số trường hợp khi các chương trình sửa đổi /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á.
Beni Cherniavsky-Paskin

@ BeniCéciavsky-Paskin Tôi đoán đó có thể là một nhận xét cho câu hỏi, vì nó áp dụng cho cả pgrepps.
Franklin Yu

3
diff <(ps aux|grep x) <(pgrep x) # :)

12
Điều này có thể trả lời câu trả lời cho câu hỏi - nhưng có lẽ bạn có thể mở rộng câu trả lời của mình để giải thích những gì một dòng lệnh này làm.
fossfreedom

1

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


Đã tìm mãi mãi cho điều này.
tresf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.