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 $pidlầ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
killallthự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.
pkilllà 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 vigiế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 vivớ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 pkillsẽ 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 pskhô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/findgiế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 -1234hoặc kill -HUP -1234hoặ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 psvớ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 grephoặ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 grephoặc awklệnh của bạn có thể được liệt kê trong psđầu ra ( psvà 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.
pkillcó 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ó killmà 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 -efvào pkillhoặc là pgrepgì? 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
pkilltừprocpsgói.