Làm thế nào để giết tất cả các quá trình khớp với một tên?


260

Nói rằng tôi muốn giết mọi quá trình có chứa từ amarok. Tôi có thể in ra các lệnh tôi muốn thực hiện. Nhưng làm thế nào để tôi thực sự làm cho vỏ thực thi chúng. I E.

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'
Output:
kill -9 3052
kill -9 3071
kill -9 3076
kill -9 3077
kill -9 3079
kill -9 3080
kill -9 3082
kill -9 3083
kill -9 3084
kill -9 3085
kill -9 3086
kill -9 3087
kill -9 3088
kill -9 3089
kill -9 4031

Thêm | sh -xsau phần còn lại của dòng lệnh của bạn?
Jonathan Leffler

7
không bao giờ sử dụng kill -9trên một quy trình, xem [quản lý quy trình] [1] [1]: mywiki.wooledge.org/iêu ...
Fredrik Pihl

Thêm vào nhận xét trên không chỉ là kill -9 là một ý tưởng tồi mà còn là thực tế rằng bạn đang cố gắng giết nhiều tiến trình thông qua tên của chúng. Không có gì độc đáo về tên của một quy trình và do đó là một ứng cử viên xấu để nhận dạng.
Raul-

Nó cũng sẽ giết amarokxquá trình? Tôi pkill vi, nó giết chết supervisorctlcó chứa 'vi' trong từ.
Gank

4
Bài viết về việc không sử dụng -9là khá hữu ích - có thông tin nào tốt hơn về lý do tại sao mọi người không nên sử dụng nó? Nó chỉ nói "không, và sa thải những người sử dụng nó"; nhưng tất cả những gì tôi từng thấy ở mọi nơi khác kill -9 {pid}là cách giết một thứ gì đó ...
lùn

Câu trả lời:


438

Từ man 1 pkill

-f     The pattern is normally only matched against the process name.
       When -f is set, the full command line is used.

Điều đó có nghĩa là, ví dụ, nếu chúng ta thấy những dòng này trong ps aux:

apache   24268  0.0  2.6 388152 27116 ?        S    Jun13   0:10 /usr/sbin/httpd
apache   24272  0.0  2.6 387944 27104 ?        S    Jun13   0:09 /usr/sbin/httpd
apache   24319  0.0  2.6 387884 27316 ?        S    Jun15   0:04 /usr/sbin/httpd

Chúng ta có thể giết tất cả chúng bằng cách sử dụng -ftùy chọn pkill :

pkill -f httpd

1
Tôi nhận ra điều này không phụ thuộc vào chủ đề của câu hỏi này, nhưng nó thể hiện một phương pháp thay thế và ngắn hơn, làm những gì bạn đang cố gắng làm.
Tim Bielawa

19
Để thêm sức mạnh, thêm -9vào cuối!
mlissner

Nó cũng sẽ giết httpdxquá trình? Tôi pkill vi, nó giết chết supervisorctlcó chứa 'vi' trong từ.
Gank

Tuyệt vời - Ubuntu 18.04.1 LTS
Salathiel Genèse

Đối với trường hợp phù hợp không nhạy cảm sử dụng -i, như pkill -fi wine. Để xác minh trước và sau, sử dụng ps uax | grep -i wine.
quạ Vulcan

207
ps aux | grep -ie amarok | awk '{print $2}' | xargs kill -9 

xargs (1): xargs - xây dựng danh sách đối số và thực thi tiện ích. Hữu ích khi bạn muốn đường ống trong đối số cho một cái gì đó giống như killhoặc lshoặc vân vân.


3
Điểm để đề cập đến xargs - tất cả những thứ pgrep / pkill này đều rất tốt, nhưng xargs là một công cụ có mục đích chung và là tiêu chuẩn trên mọi linux / unix.
chrisdowney

4
"giết: không có quá trình như vậy"
Cerin

3
Cerin đó là vì nó cũng đang cố gắng giết quá trình grep, nó đã hoàn thành. Nó sẽ ổn thôi
Costi Muraru

6
Có một mẹo nhỏ để tránh nắm bắt quy trình grep: ps aux | grep -ie [a] marok | awk '{in $ 2}' | xargs kill -9
RCross

8
bạn cũng có thể thêm một cuộc gọi grep khác để lọc grep (tôi thấy việc này dễ đọc / dễ nhớ hơn) ps aux | grep -ie amarok | grep -v grep | awk '{print $2}' | xargs kill -9 ( grep -vviết tắt của từ khóa grep --invert)
driftcatcher

47

sử dụng pgrep

kill -9 $(pgrep amarok)

26
thậm chí thanh lịch hơn:pkill -9 amarok
glenn jackman

1
pkill xử lý phần "mọi quy trình có chứa từ <word>" mà không tạo ra nhiều đường ống hoặc quy trình. Xem tùy chọn -f để tìm kiếm tên quy trình đầy đủ để loại bỏ nhu cầu về pgrep.
Tim Bielawa

2
Coi chừng pkill theo mặc định cho phép khớp một phần trên tên quy trình. Lệnh này cũng sẽ giết amarok2 nếu nó tồn tại. Sử dụng -x hoặc -f nếu bạn muốn chỉ định tên chính xác.
dùng79878

Nó sẽ thất bại nếu không phù hợp với pgrep
alfredocambera

để sử dụng kết hợp tên đầy đủkill -9 $(pgrep -f amarok)
rạp chiếu phim

27

Cách an toàn để làm điều này là:

pkill -f amarok

1
Để thêm vào điều này, tôi đã thêm -lcờ. Tôi thực sự chỉ bí danh pkillđể pkill -fltôi có thể chạy một cái gì đó như thế pkill jbossvà nó sẽ phun ra quá trình mà nó vừa giết.
nland

Nó cũng sẽ giết amarokxquá trình? Tôi pkill vi, nó giết chết supervisorctlcó chứa 'vi' trong từ.
Gank

Điều này khác với câu trả lời hàng đầu (Tim's) như thế nào? Chỉ cần khớp với tên ví dụ, nếu không trông giống hệt nhau? @ndland pkill: invalid option -- 'l'- pkill từ Procps-ng 3.3.12
Xen2050

18

Tôi nghĩ lệnh killall này chính xác là những gì bạn cần. Lệnh được mô tả là "tiêu diệt các tiến trình theo tên". Thật dễ sử dụng. Ví dụ:

killall chrome

Lệnh này sẽ giết tất cả quá trình của Chrome. Đây là một liên kết về lệnh killall

http://linux.about.com/l Library / cmd / blcmdl1_killall.htmlm

Hy vọng lệnh này có thể giúp bạn.


Điều này chỉ phù hợp với tên, không phải dòng lệnh đầy đủ. Chắc chắn không giống như ps auxđầu ra của tìm kiếm
Xen2050

12

pkill -x khớp chính xác với tên quy trình.

pkill -x amarok

pkill -f tương tự nhưng cho phép một mẫu biểu thức chính quy.

Lưu ý rằng pkill không có tham số nào khác (ví dụ -x, -f) sẽ cho phép khớp một phần trên tên quy trình. Vì vậy, "pkill amarok" sẽ giết amarok, amarokBanana, Bananaamarok, v.v.

Tôi ước -x là hành vi mặc định!


Nó cũng sẽ giết amarokxquá trình? Tôi pkill vi, nó giết chết supervisorctlcó chứa 'vi' trong từ.
Gank

@Gank, vâng, bất kỳ tên quy trình có "amarok" trong đó ở đâu đó.
user79878

Làm thế nào để chỉ giết amarok thay vì amarokx?
Gank

1
@ Gank, cờ -x. pkill -x amarok
dùng79878

4

Nếu bạn muốn thực thi đầu ra của một lệnh, bạn có thể đặt nó vào bên trong $(...), tuy nhiên đối với tác vụ cụ thể của bạn, hãy xem killallpkillcác lệnh.


3

Bạn cũng có thể đánh giá đầu ra của mình dưới dạng một quy trình phụ, bằng cách bao quanh mọi thứ có dấu tích ngược hoặc đặt nó vào trong $ ():

`ps aux | grep -ie amarok | awk '{print "kill -9 " $2}'`

 $(ps aux | grep -ie amarok | awk '{print "kill -9 " $2}')     

3

thử kill -s 9ps -ef |grep "Nov 11" |grep -v grep | awk '{print $2}' Để giết các tiến trình của ngày 11 tháng 11 hoặc giết -s 9 ps -ef |grep amarok|grep -v grep | awk '{print $2}' Để giết các tiến trình có chứa từ amarok


0

Có thể thêm các lệnh vào tập tin thực thi, thiết lập quyền + x và sau đó thực thi?

ps aux | grep -ie amarok | awk '{print "kill -9 " $2}' > pk;chmod +x pk;./pk;rm pk

-1

Nếu bạn đang sử dụng cygwin hoặc một số shell tối thiểu mà killallbạn thiếu, bạn chỉ có thể sử dụng tập lệnh này:

killall.sh - Giết theo tên tiến trình.

#/bin/bash
ps -W | grep "$1" | awk '{print $1}' | xargs kill --

Sử dụng:

$ killall <process name>

Tôi đang nhận đượckill: invalid argument f
rosstex

1
Hãy thử thay thế -f bằng -
Tony O'Hagan
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.