Làm thế nào để giết nhiều tiến trình


21

để tìm ra PID của quá trình tiêu diệt:

pgrep <process command>

Sau đó tôi sử dụng lệnh kill để tiêu diệt PID được trả về bởi pgrep <process command>

kill <PID>

Những lệnh này có thể được kết hợp thành một để có thể giết chết các PID hoặc PID được trả về pgrep <process command>không? Hoặc có một phương thức giết nhiều tiến trình bằng tên lệnh?

Cái gì đó như : kill(pgrep <name of process>)


3
Bạn đã thử pkillchưa Ngoài ra, bạn có thể muốn sử dụng xargs.
MatthewRock

1
Lưu ý rằng các trang man cũng tốt cho những thứ như thế này. Thường thì họ không chỉ cho bạn biết cách sử dụng lệnh, họ còn cho bạn biết về các lệnh liên quan. Trong trường hợp này, pgreptrang man đề cập đến pkillmọi nơi (vì 2 lệnh đến từ cùng một gói).
Patrick

Câu trả lời:


27

Bạn có thể sử dụng pkill:

pkill httpd

Bạn cũng có thể muốn sử dụng thay thế quá trình (mặc dù điều này không rõ ràng):

kill $(pgrep command)

Và bạn có thể muốn sử dụng xargs:

pgrep command | xargs kill

4
Tôi đã làm một điều tương tự trong một câu trả lời và tôi đã chỉ ra rằng tôi đã đưa ra một điều kiện cuộc đua. ID tiến trình có thể bị vô hiệu giữa các cuộc gọi đến pgrepkill. Chỉ cần sử dụng pkill.
Kusalananda

3
@Kusalananda điều tương tự cũng có thể xảy ra giữa pkillviệc lấy danh sách quy trình và thực sự gửi tín hiệu, thật khó để thấy trong trường hợp đó.
hobbs

1
Tôi sẽ cố gắng soạn ra một câu trả lời lặp đi lặp lại một cái gì đó như kill $(ps|head -1)để tránh điều kiện cuộc đua ... nhưng thực sự không có cách nào để tránh nó. Quá trình có thể chết tại bất kỳ điểm nào trong đường ống.
Ross Presser

Chỉ cần cẩn thận với pkill vì một số chương trình có thể có nhiều hơn một phiên bản đang chạy và bạn có thể không muốn giết tất cả chúng. Chạy pgrep trước sẽ giúp miễn là một lần khác không bắt đầu giữa thời gian bạn chạy pgrep và pkill (cuộc đua).
Joe

1
Ngay cả một chương trình C không thể tránh điều kiện cuộc đua, cửa sổ sẽ chỉ nhỏ hơn. Cách duy nhất để thực hiện nó một cách nguyên tử là thêm một lệnh gọi hệ thống giết chết các tiến trình theo tên. Nhưng ID quá trình thường sẽ không được sử dụng lại rất nhanh, vì vậy mối nguy hiểm hầu như không có.
Barmar

17

Bạn cũng có thể sử dụng killall, vd

killall firefox

để gửi SIGTERMđến tất cả các firefoxquy trình.


8
Lưu ý rằng killallcó ý nghĩa khác nhau trên các hệ thống unix khác nhau - nếu bạn đang sử dụng hệ thống không phải là Linux, hãy đảm bảo kiểm tra tài liệu.
Random832

killall -KILL firefoxcó thể cảm thấy rất bổ ích.
ống

Tính không di động killalllà lý do tại sao tôi không bao giờ sử dụng nó. Chạy killalltrên một hộp năng lượng mặt trời chẳng hạn là thảm họa.
Patrick

9

Có, bạn có thể sử dụng tính năng bash và lặp qua đầu ra.

$ for proc in $(pgrep <process command>); do kill $proc; done

Tôi nhận đượckill <no>:failed: operation not permitted
Timo

Có thể bạn không có quyền hoặc quy trình không còn tồn tại nữa, vui lòng tham khảo: superuser.com/questions/1175485/ợi
lcipriani

0

Bạn có thể giết nhiều tiến trình với mảng. Trong trường hợp này, bạn có thể chỉ định các tùy chọn là $ip, $hostnamehoặc một cái gì đó tương tự.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
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.