Loại trừ grep khỏi danh sách quy trình


27

Tôi đã tổng hợp một lệnh để trả về ID tiến trình của trình nền đang chạy:

ps aux | grep daemon_name | awk "{ print \$2 }"

Nó hoạt động hoàn hảo và trả về PID, nhưng nó cũng trả về một PID thứ hai có lẽ là quá trình tôi đang chạy. Có cách nào để tôi có thể loại trừ lệnh của mình khỏi danh sách các PID được trả về không?

Tôi đã thử nghiệm nó một vài lần và có vẻ như lệnh của tôi luôn là PID thứ hai trong danh sách, nhưng tôi không muốn lấy chỉ số PID đầu tiên trong trường hợp không chính xác.


Câu trả lời:


27

Công -vtắc của grep đảo ngược kết quả, loại trừ nó khỏi hàng đợi. Vì vậy, làm cho nó như:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

Cập nhật . Bạn cũng có thể sử dụng -Cchuyển đổi để chỉ định tên lệnh như vậy:

ps -C daemon_name -o pid=

Cái sau -oxác định cột nào của thông tin bạn muốn trong danh sách. pidchỉ liệt kê cột id quá trình. Và dấu bằng =sau pidnghĩa là sẽ không có tiêu đề cột cho cái đó, vì vậy bạn chỉ nhận được các số rõ ràng - của PID.

Hi vọng điêu nay co ich.


2
Sử dụng "grep -v grep": Chỉ cần xem rằng bạn có thể có một dòng lệnh dài bao gồm "grep" (Giả sử ai đó đã viết thư viện grep => "-Llibgrep.so" hoặc "-cp libgrep.jar". Tôi sẽ lặp lại mô hình: grep -v "grep daemon_name"
phil_w

Điểm tốt, @phil_w, cảm ơn. Cập nhật câu trả lời.
Serg ikS

23

Bạn có thể sử dụng một thủ thuật lớp nhân vật. "[d]" không khớp "[d]" chỉ "d".

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

Tôi thích điều này để sử dụng | grep -v grep.


Heh đó là một mẹo thông minh, tôi thích nó. Hiện tại tôi đang giữ mọi thứ đơn giản trong khi tôi đang học và | grep -v grepsẽ dễ hiểu hơn khi tôi xem lại mã của mình.
tak

Tôi đang cố gắng hiểu làm thế nào [h] ack này hoạt động. Bạn có thể vui lòng giải thích những gì bạn có ý nghĩa với "[d]" does not match "[d]" only "d"?
Nowaker

@Damian: Dấu ngoặc vuông là ký tự đại diện (phân định một bộ ký tự) trong biểu thức tìm kiếm để greplệnh sẽ không khớp với psdòng đầu ra cho grepchính lệnh đó (cái mà tak gọi là "một PID thứ hai" trong câu hỏi ban đầu). biểu a[xy]dhiện không phù hợp với văn bản a[xy]dnhưng nó văn bản phù hợp axdhoặc văn bản ayd. Do đó biểu thức [f]ookhớp với văn bản foonhưng không phải văn bản [f]oo. Tôi hy vọng điều đó là rõ ràng.
RedGrittyBrick

Được rồi, tôi đã sai về ARGV. Đây chỉ là một regrec. Cảm ơn.
Nhà sản xuất bây giờ

Quỷ dữ thông minh! Phải suy nghĩ về nó một lát - cảm ơn!
Subfuzion

15

Tránh phân tích cú pháp psđầu ra nếu có nhiều lựa chọn thay thế đáng tin cậy hơn.

pgrep daemon_name
pidof daemon_name

Yay, cuối cùng quản lý quá trình có ý nghĩa bây giờ.
Błażej Michalik

pgreptìm kiếm theo chuỗi con trong khi pidofkhớp chính xác - exaclty những gì tôi cần! cảm ơn!
Sasha

3

Các ps -Ctùy chọn không phải là phổ trên tất cả các hệ thống Unix dựa nhưng nếu nó hoạt động trên hệ thống của bạn. Thay vào đó tôi sẽ tránh grep hoàn toàn:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

Không cần phải thoát bất cứ điều gì trong dấu ngoặc đơn. ps auxsẽ cung cấp cho bạn danh sách đầy đủ các quy trình trên hầu hết các hệ thống dựa trên Unix và awkthường được cài đặt theo mặc định.


3

Sử dụng pgrepđể tìm pid của một quá trình theo tên:

pgrep proc_name

Với tên quá trình bổ sung trong kết quả ( -l):

pgrep -l proc_name

Tìm kiếm và hiển thị tên tiến trình ( -l) và đối số ( -f):

pgrep -lf proc_name_or_argument

Điều tốt pgreplà nó sẽ không bao giờ báo cáo như là một trận đấu. Nhưng bạn không cần phải lấy pid pgrepvà sau đó giết quá trình tương ứng kill. Sử dụng pkillthay thế:

pkill proc_name

Chỉ định SIGKILLtín hiệu ( -9hoặc -KILL) thay vì SIGTERM(theo mặc định):

pkill -9 proc_name

Tìm tên tiến trình ( -l) và đối số ( -f), yêu cầu xác nhận ( -I) trước khi giết nó bằng SIGKILLtín hiệu ( -9hoặc -KILL):

pkill -KILL -Ilf proc_name_or_argument

Lưu ý rằng -Itùy chọn chỉ khả dụng trên một số phiên bản pkill, ví dụ: phiên bản trên OS X Mavericks.


0

Nếu bạn đang sử dụng bash, bạn cũng có thể làm điều này theo cách sau bằng cách sử dụng ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

Điều này là không cần thiết phức tạp. Tại sao không đơn giản gọips -eaf | grep "process_name" | awk '{print $2}'
David Nedrow

0

dòng này cung cấp cho bạn trở lại pid (id quá trình) không bao gồm "grep"

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

Một số lời giải thích sẽ tốt đẹp.
davidbaumann

Điều này về cơ bản giống như câu trả lời được chấp nhận, nhưng với trang trí khác nhau.
Scott
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.