Câu trả lời:
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
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.
killall -m my_pattern
.
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
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Mã này đang làm gì vậy?
Việc ps -ef
tạ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 grep
nó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.
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 kill
phầ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
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 -ef
liệ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.
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.
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.
-r
tùy chọn không tồn tại trên OS X, vì vậy có vẻ như vậy.
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.
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).
ps
trả về ba quy trình 123, 234 và 345, bạn có thể kill 123 234 345
giống như bạn có thể rm
hoặc cat
nhiều đối số tệp.
grep
for KILLPID in
rìu ps | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
sẽ xóa grep
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 }')
Nếu bạn đánh giá pkill -f PATTERN
mộ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.
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
-r
hoặc --regexp
, đó là ngắn và tùy chọn dài GNU, tương ứng.
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.
Nghe tệ thật?
pkill `pidof myprocess`
thí dụ:
# kill all java processes
pkill `pidof java`
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.
tốt nhất và an toàn nhất để sử dụng pgrep -f
với kill
, hoặc chỉ pkill -f
, đầu ra của grep
ing ps
có thể sai.
Không giống như sử dụng ps | grep
mà bạn cần lọc ra dòng grep bằng cách thêm | grep -v
hoặc sử dụng các thủ thuật mẫu, pgrep
chỉ 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
/ START
hoặ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
+ pkill
khô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$"
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:
ps ax
bao gồm grep, vì vậy tôi loại trừ nó với grep -Eiv 'grep'
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
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?