Làm thế nào để giết tất cả quá trình với tên được đưa ra?


16

Tôi chạy lệnh ps -A | grep <application_name>và nhận danh sách các quá trình như thế này:

19440 ?        00:00:11 <application_name>
21630 ?        00:00:00 <application_name>
22694 ?        00:00:00 <application_name>

Tôi muốn giết tất cả các quá trình từ danh sách: 19440, 21630, 22694.

Tôi đã thử ps -A | grep <application_name> | xargs kill -9 $1nhưng nó hoạt động với lỗi.

kill: illegal pid ?
kill: illegal pid 00:00:00
kill: illegal pid <application_name>

Làm thế nào tôi có thể làm điều này một cách duyên dáng?

Câu trả lời:


25
pkill -f <application_na>

Sẽ giết tất cả các quy trình có chứa mẫu <application_na>trong tên của chúng.

người đàn ông


9

Vấn đề là ps -A | grep <application_name> | xargs -n1trả về đầu ra như thế này

19440
?
00:00:11
<application_name>
21630
?
00:00:00
<application_name>
22694
?
00:00:00
<application_name>

Bạn có thể sử dụng awkđể nhận đầu tiên một cột psđầu ra .

ps -A | grep <application_name> | awk '{print $1}' | xargs -n1

Sẽ trả về danh sách các PID

19440
21630
22694

Và thêm kill -9 $1bạn có một lệnh giết tất cả các PID

ps -A | grep <application_name> | awk '{print $1}' | xargs kill -9 $1

này là hoàn hảo tôi thử nghiệm nó trên kịch bản bash nó giết processer immediatly không có lỗi + thậm chí nếu quá trình is'nt bắt đầu nó cho thấy không có lỗi mà là những gì tôi muốn, ở đây ví dụ về ffmpeg processer kẻ giết người, nano /usr/bin/ffmpegk . . . . ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 . . . . chmod a+rx /usr/bin/ffmpegk
Salem F

Tôi có một vấn đề với điều này khi tôi nhận được đầu ra kill -9nếu không có quy trình nào khớp
Daniel F

1
Thay vì grep, bạn nên sử dụng awkđể khớp với tên:ps -A | awk "\$4 == \"$1\" { print \$1; }"
Toby Speight

0

killall có thể làm điều đó

$ killall application_name

Là giết tất cả cho phép biểu thức chính quy trong một tên ứng dụng?
Łukasz D. Tulikowski

killall --regexp "appl.*me"Mặc dù có thể có các triển khai killall khác nhau. Xem man killall.
rudimeier

killall không đủ đôi khi tôi cần gửi nó ba lần để giết tiến trình, và thậm chí không giết được nó, giải pháp làm việc nhanh duy nhất cho tôi là kill -9 pidtôi nghĩ @ ŁukaszD.Tulikowski là giải pháp làm việc tốt nhất đặc biệt cho các tập lệnh bash.
Salem F

-1
ps -eaf | grep -i applicationname| grep -iv 'grep'| awk '{print "kill -9" " "  $2}'|sh

Mặc dù tôi chưa bình chọn cho câu hỏi này, nhưng bạn đã mô tả lý do tại sao nó khác hoặc tốt hơn các giải pháp khác - rất giống với giải pháp này - hoặc mô tả lý do tại sao OP gặp rắc rối với biến thể của chúng.
Jeff Schaller

-2

Cách tiếp cận của tôi tương tự như của @ Łukasz D. Tulikowski. Thay vì sử dụng grep <application_name>; Tôi đã sử dụng grep "[a]pplication_name", không phù hợp với dòng lệnh quy trình riêng của nó.

Biểu thức dấu ngoặc vuông là một phần của grepkhớp mẫu lớp ký tự. (Tham khảo) .


Bạn có thể sử dụng awkđể nhận đầu tiên một cột psđầu ra.

ps -A | grep "[a]pplication_na" | awk '{print $2}' | xargs -n1

Sẽ trả về danh sách các PID

7644
407
406

Sau này thêm kill -9 $1bạn có một lệnh giết tất cả các PID

ps aux | grep "[a]pplication_na" | awk '{print $2}' | xargs kill -9 $1

Tại sao grepthay vì sử dụng awkđể làm bài kiểm tra chính xác hơn? grepsẽ khớp với các tên bao gồm mục tiêu là chuỗi con, ví dụ.
Toby Speight
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.