Làm thế nào để giết tất cả các quá trình với một phần tên nhất định? [đóng cửa]


623

Tôi muốn giết tất cả các quy trình mà tôi có được bằng cách:

ps aux | grep my_pattern

Làm thế nào để làm nó?

Điều này không hoạt động:

pkill my_pattern

11
Chỉ my_patternđơn giản là một chuỗi con của tên, hoặc nó có chứa bất kỳ ký tự đặc biệt regex nào không?
Sven Marnach

Câu trả lời:


1318

Sử dụng pkill -f, khớp với mẫu cho bất kỳ phần nào của dòng lệnh

pkill -f my_pattern

7
@Jaya: nó cũng khá bừa bãi trong việc giết chóc. Thật dễ dàng để xử lý sai lầm ...
thkala

1
@Jaya: bạn sẽ không thuyết phục tôi :-). Tôi đã bị đốt cháy quá nhiều lần bởi các tập lệnh của bên thứ ba khăng khăng sử dụng pkill- lỗi phổ biến nhất là giả định rằng chỉ có một phiên bản của mỗi nhị phân có thể tồn tại tại bất kỳ thời điểm nào.
thkala

4
Đối với bất kỳ người dùng Mac nào tìm thấy câu trả lời này, như tôi đã làm, tương đương với Mac là killall -m my_pattern.
Zev Eisenberg

1
Nếu bạn có một số quy trình treo không bị giết, hãy sử dụng pkill -f -9 để giết chúng không thương tiếc
MacK

18
Tôi khuyên bạn nên sử dụng pgrepđầu tiên để xác minh những gì bạn sẽ giết. Bạn có thể sử dụng pgrep -lđể xem tên quy trình hoặc pgrep -ađể xem các dòng lệnh đầy đủ. Nó sử dụng các cờ giống như pkill. Vì vậy, trong trường hợp này bạn có thể sử dụng pgrep -fa my_pattern.
studgeek

158

Giết tất cả các quy trình khớp với chuỗi "myProcessName":

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Nguồn: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep- Process-grep-v-grep -awk-print-2-xargs-kill-9

Mã này đang làm gì vậy?

Việc ps -eftạo ra một danh sách các id tiến trình trên máy tính hiển thị cho người dùng này. Các grep ống lọc xuống cho các hàng có chứa chuỗi đó. Việc grep -v grepnói không khớp với quá trình thực hiện grepping. Bản in awk ống cho biết chia các hàng trên khoảng trắng dấu phân cách mặc định và bộ lọc cho cột thứ hai là id tiến trình của chúng tôi. Các ống xargs tạo ra một quy trình mới để gửi tất cả các pid đó đến kill -9, kết thúc tất cả.

Các mã trên là xấu, nguy hiểm, xấu xí và hackish vì nhiều lý do.

  1. Nếu mã bị kết thúc bắt buộc thực hiện bất kỳ cơ sở dữ liệu nào hoặc giao dịch an toàn với điều kiện cuộc đua xác suất thấp, một phần trăm thời gian, tính nguyên tử của giao dịch đó sẽ bị phá hủy, tạo ra hành vi không xác định. giết -9 không có tù nhân. Nếu mã của bạn nhạy cảm với điều này, hãy thử thay thế xargs killphần bằng cờ được truyền yêu cầu tắt máy duyên dáng và chỉ khi yêu cầu đó bị từ chối, hãy dùng đến lần cuốikill -9

  2. Có một khả năng khác không là bạn sẽ vô tình kết thúc hệ điều hành hoặc gây ra hành vi không xác định trong một quy trình không liên quan, dẫn đến sự mất ổn định của toàn hệ thống vì ps -efliệt kê mọi quy trình có thể tồn tại và bạn không thể chắc chắn một số thư viện bên thứ 3 kỳ lạ chia sẻ Tên tiến trình, hoặc trong khoảng thời gian giữa đọc và thực hiện lệnh giết -9, tiến trình đã thay đổi thành một tên khác và bây giờ bạn đã vô tình kết thúc một quá trình ngẫu nhiên mà bạn không có ý định.

Nhưng, nếu bạn hiểu rủi ro và kiểm soát chúng bằng những cái tên rất độc đáo và bạn sẽ ổn với một vài giao dịch bị hủy hoặc tham nhũng dữ liệu không thường xuyên, thì 99,9% thời gian sẽ ổn. Nếu có sự cố, hãy khởi động lại máy tính, đảm bảo không có bất kỳ va chạm nào trong quá trình. Chính vì mã như thế này tạo ra tập lệnh hỗ trợ kỹ thuật: "Bạn đã thử khởi động lại máy tính chưa" một meme cấp 5.


15
Điều này sẽ đưa ra một lỗi nếu không tìm thấy quá trình khớp với tên. Bạn có thể muốn sử dụng ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9để có xargs không thực thi lệnh nếu không có đối số nào được đưa ra.
Epigene

2
Chỉ cần một sửa đổi nhỏ, có lẽ tốt hơn là trích dẫn tên quy trình: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 Không có dấu ngoặc kép, chỉ một trong các quy trình nền của tôi bị giết trong lần chạy đầu tiên. Chạy nó lại giết chết phần còn lại.
Ali Haider

-rtùy chọn không tồn tại trên OS X, vì vậy có vẻ như vậy.
Danijel

52

Nếu bạn cần linh hoạt hơn trong việc lựa chọn các quy trình sử dụng

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Bạn có thể sử dụng grep -e, v.v.


4
-1 Bạn không cần một vòng lặp, bạn chỉ có thể kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(lưu ý cả việc tái cấu trúc; xem thêm nhận xét của tôi về câu trả lời của @ syhesizerpatel).
tripleee

11
@tripleee Không có vấn đề gì với downvote của bạn, nhưng bạn nhận ra rằng OQ là "Tôi muốn giết tất cả các quy trình mà tôi nhận được bằng cách: ps aux | grep my_potype" , mà tôi chấp nhận một cách nghiêm túc.
Eugen Rieck

Kill sẽ giết tất cả các tiến trình trong một lần, bạn không cần một vòng lặp cho điều đó. Nếu pstrả về ba quy trình 123, 234 và 345, bạn có thể kill 123 234 345giống như bạn có thể rmhoặc catnhiều đối số tệp.
tripleee

@tripleee Tôi đề nghị gỡ bỏgrep
Eugen Rieck

for KILLPID in rìu ps | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; donesẽ xóa grep
Justin E

18

bạn có thể sử dụng lệnh sau để liệt kê quá trình

ps aux | grep -c myProcessName 

nếu bạn cần kiểm tra số lượng của quá trình đó thì hãy chạy

ps aux | grep -c myProcessName |grep -v grep 

sau đó bạn có thể giết quá trình bằng cách sử dụng

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

bạn có thể sử dụng lệnh sau để liệt kê quá trình ps aux | grep -c myProcessName nếu bạn cần kiểm tra số lượng của quá trình đó, sau đó chạy ps aux | grep -c myProcessName | grep -v grep sau đó bạn có thể giết tiến trình bằng cách sử dụng kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')
Được tạo ra Thanima

13

Ngoài ra bạn có thể sử dụng killall -r my_pattern. -rGiải thích mẫu tên quá trình như một biểu thức chính quy mở rộng.

killall -r my_pattern

8

Nếu bạn đánh giá pkill -f PATTERNmột chút quá nguy hiểm, tôi đã viết cho ezkill một tập lệnh bash nhắc bạn chọn quy trình nào trong số những quy trình phù hợp với THỰC TRẠNG mà bạn muốn giết.


7

Bạn có thể sử dụng lệnh sau để

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')

4

Nếu bạn không muốn đau đầu trong việc tìm id tiến trình, hãy sử dụng biểu thức chính quy để hủy quy trình theo tên. Ví dụ, để giết chrome theo mã sẽ thực hiện thủ thuật.

killall -r --regexp chrome


1
Bạn chỉ cần một trong hai -r hoặc --regexp , đó là ngắn và tùy chọn dài GNU, tương ứng.
BigSmoke

3

Bạn có thể sử dụng lệnh sau để:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

hoặc là

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Nó làm việc cho tôi.


1
Chào mừng bạn đến với StackOverflow. Vui lòng sử dụng thụt lề 4 không gian hoặc tab cho các dòng mã của bạn để chúng được định dạng dưới dạng khối mã. Trân trọng
YakovL


2

Tìm thấy cách tốt nhất để làm điều đó cho một máy chủ không hỗ trợ pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

Bạn không phải lặp.


1

tốt nhất và an toàn nhất để sử dụng pgrep -fvới kill, hoặc chỉ pkill -f, đầu ra của greping pscó thể sai.

Không giống như sử dụng ps | grepmà bạn cần lọc ra dòng grep bằng cách thêm | grep -vhoặc sử dụng các thủ thuật mẫu, pgrepchỉ không chọn theo thiết kế.

Hơn nữa, mô hình của bạn sẽ xuất hiện trong ps's UID/ USER, SDATE/ STARThoặc bất kỳ cột nào khác, bạn sẽ nhận được các quá trình không mong muốn trong đầu ra và giết chúng, pgrep+ pkillkhông bị lỗ hổng này.

tôi cũng thấy rằng killall -r/ -regexp không hoạt động với biểu thức thông thường của tôi.

pkill -f "^python3 path/to/my_script$"

man pkill


0

Tôi lấy câu trả lời của Eugen Rieck và làm việc với nó. Mã của tôi thêm vào như sau:

  1. ps ax bao gồm grep, vì vậy tôi loại trừ nó với grep -Eiv 'grep'
  2. Đã thêm một vài if và tiếng vang để làm cho nó có thể đọc được.

Tôi đã tạo một tệp, đặt tên cho nó killserver, ở đây nó đi:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

Các kết quả

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything

0

Đây là cách:

kill -9 $(pgrep -d' ' -f chrome)

3
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Igor F.
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.