Giả sử tôi có một nghìn hoặc nhiều phiên bản của bất kỳ quá trình nào (ví dụ vi
:) chạy. Làm thế nào để tôi giết tất cả chúng trong một lần bắn / một lệnh một dòng / một lệnh?
Giả sử tôi có một nghìn hoặc nhiều phiên bản của bất kỳ quá trình nào (ví dụ vi
:) chạy. Làm thế nào để tôi giết tất cả chúng trong một lần bắn / một lệnh một dòng / một lệnh?
Câu trả lời:
Có chuyện gì với người già,
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
Có nhiều cách để làm điều đó hiệu quả hơn,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
và các biến thể khác, nhưng ở cấp độ cơ bản, nó luôn hoạt động với tôi.
echo kill -9 $pid
lần đầu tiên vì vậy tôi biết những gì tôi đang nhận được. Tôi không chắc AIX có pkill
, đó là bánh mì và bơ UNIX của tôi. Và nó thực sự đủ tệ để bị bỏ phiếu - lẻ.
csh
Sử dụng killall,
killall vi
Điều này sẽ giết tất cả các lệnh có tên 'vi'
Bạn cũng có thể thêm tín hiệu, ví dụ SIGKILL
killall -9 vi
killall -9 vi
killall
thực hiện chính xác những gì mà tên cho thấy ... nó giết chết quá trình khởi tạo.
pkill
là những gì tôi khuyên, nếu nó khả dụng ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Bạn có thể chỉ định các quy trình theo tên lệnh, theo dòng lệnh đầy đủ hoặc các tiêu chí khác. Ví dụ, pkill vi
giết tất cả các chương trình có tên lệnh chứa chuỗi con vi
. Để giết chỉ các quá trình được gọi vi
, sử dụng pkill -x vi
. Để chỉ giết các tiến trình được gọi vi
với một đối số cuối cùng kết thúc .conf
, hãy sử dụng pkill -fx 'vi.*\.conf'
.
Để xem danh sách các PID pkill
sẽ gửi tín hiệu đến, hãy sử dụng pgrep
, có cùng một cú pháp ngoại trừ việc nó không chấp nhận tên hoặc số tín hiệu. Để xem thêm thông tin về các quy trình này, hãy chạy
ps -p "$(pgrep …)"
Trong Linux, bạn cần ps -p $(pgrep -d, …)
thay thế (đó là một lỗi: Linux ps
không tuân thủ POSIX).
Một cách phổ biến khác để xác định các quy trình cần hủy là các quy trình có một tệp nhất định mở (có thể là quy trình thực thi của quy trình). Bạn có thể liệt kê những thứ này với fuser
; sử dụng fuser -k
để gửi cho họ một tín hiệu. Ví dụ, fuser -k /usr/bin/find
giết tất cả các hiệu ứng đang chạy của find
.
Nếu có một quy trình chạy trốn liên tục, bạn có thể cần phải giết toàn bộ nhóm quy trình cùng một lúc. Một nhóm quy trình được xác định bởi tiêu cực của người lãnh đạo của nó, đó là quá trình tổ tiên của tất cả các quy trình trong nhóm. Để xem nhóm quy trình mà một quy trình thuộc về, hãy chạy ps -o pgid
(cộng với bất kỳ tùy chọn nào để chọn (các) quy trình sẽ hiển thị). Nếu bạn xác định rằng bạn muốn giết thủ lĩnh nhóm quy trình 1234 và tất cả các con của nó, hãy chạy kill -1234
hoặc kill -HUP -1234
hoặc bất kỳ tín hiệu nào khác.
Nếu bạn không thể tìm thấy một cách tốt hơn, hãy sử dụng ps
với các tùy chọn phù hợp để liệt kê tất cả các quy trình và lọc nó bằng grep
hoặc một số lệnh lọc văn bản khác. Cẩn thận không vô tình khớp với các quy trình khác đang chạy một lệnh có tên tương tự hoặc với một đối số có chứa tên đó. Ví dụ:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
Hãy nhớ rằng chính lệnh grep
hoặc awk
lệnh của bạn có thể được liệt kê trong ps
đầu ra ( ps
và lệnh lọc được bắt đầu song song, do đó, liệu nó có hiển thị hay không phụ thuộc vào thời gian). Điều này đặc biệt quan trọng nếu các đối số lệnh được bao gồm trong ps
đầu ra.
pkill
ở đây rất đẹp Bạn có thể cung cấp cho nó rất nhiều tham số để tinh chỉnh mẫu.
pkill
có sẵn trên Linux, BSD và Solaris - afaik. Vì vậy, nó có một sự lây lan lớn hơn killall
.
Cách dễ nhất để làm là trước tiên hãy kiểm tra xem bạn có nhận được ID quy trình đúng với:
pgrep -f [part_of_a_command]
Nếu kết quả là như mong đợi. Đi với:
pkill -f [part_of_a_command]
pgrep -f "command name"
Thú vị không ai nhắc đến cái này. pidof xuất các pids phân tách không gian của các tiến trình khớp với tên tiến trình đã thông qua. Như vậy, bạn có thể trực tiếp sử dụng đầu ra của nó kill
mà không cần đường ống. Trên Arch Linux tôi sử dụng
kill -9 $(pidof <proc name>)
Nhược điểm của giải pháp này là nó không cho phép sử dụng các biểu thức thông thường.
Tôi sẽ đề nghị bạn thử pkill
.
Ví dụ: ps -ef | pkill -f command
Để hiển thị danh sách tất cả các quy trình bị giết trước tiên, hãy thử pgrep
:
Ví dụ: ps -ef | pgrep -f command
ps -ef
vào pkill
hoặc là pgrep
gì? Các lệnh này không đọc từ đầu vào tiêu chuẩn.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
từprocps
gói.