Làm thế nào để giết chỉ khi quá trình đang chạy?


14

Hiện tại tôi sử dụng dòng như thế này trong tệp tập lệnh sh của mình:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Nhưng tôi tự hỏi làm thế nào để gọi nó chỉ khi quá trình ( myServerở đây) đang chạy?


Không thể gọi killchỉ khi quá trình đang chạy, bởi vì có một điều kiện chạy đua giữa thử nghiệm và yêu cầu kill(có thể quá trình dừng lại vì một lý do khác trong thời gian ngắn đó). Bạn nên sử dụng pkillhoặc killalllàm chính xác như những gì bạn cố gắng làm, nhưng với ít loại hơn (và có lẽ một số lợi thế khác nữa).
JanC

Câu trả lời:


20

Tôi thường chỉ sử dụng pgrep và pkill

if pgrep myServer; then pkill myServer; fi

7
Tại sao không pkill myServerhay killall -q myServer? Không có nhược điểm nào trong việc cố gắng tiêu diệt các quá trình không tồn tại.
David foerster

12
Nó sẽ không thoát 0 nếu không có tiến trình để giết, vì vậy nó có thể phá vỡ các tập lệnh.
boutch55555

6
Nối || truerồi.
David Foerster

Đúng, nhưng bạn sẽ không linh hoạt thêm người khác để thông báo cho bạn rằng quy trình đã chết.
boutch55555

Thế còn if ! killall -q myServer; then echo ERROR; fi?
David Foerster

9

Bạn có thể giết các tiến trình bằng tên bằng cách sử dụng pkillhoặc killallkiểm tra trang người đàn ông của họ.


có, không giống như kill, điều này chỉ giết chết nếu quá trình đang chạy. Ví dụpkill -u myuser -f myprocess\.[0-9]+
Chase T.

6

Một chút của một cách tiếp cận khác sẽ là một cái gì đó như thế này:

killall PROCESS || echo "Process was not running."

Điều này sẽ tránh 1Mã lỗi được trả về từ killalllệnh, nếu quá trình không tồn tại. Phần echosẽ chỉ đi vào hành động, nếu killalltrở lại 1, trong khi chính nó sẽ trở lại 0(thành công).


5
Sử dụng killall -qlà tốt hơn
Anwar

1
Cảnh báo, killall -qkhông được hỗ trợ trên tất cả các hương vị unix, macOS Catalina vẫn không có.
tresf

0

thử sử dụng:

sudo kill `pidof process_name`

trong đó process_name là tên của tiến trình bạn muốn giết. Điều tuyệt vời ở đây là pidof sẽ liệt kê các pid của tất cả các quy trình khớp với tên đã cho. Vì kill chấp nhận nhiều pid's, nó sẽ giết tất cả chúng trong một ý thích duy nhất.

Hãy cho tôi biết nếu điều này sẽ giúp.


Nếu danh sách trống thì sao? (quan điểm chính của tôi là không gọi kill nếu có thể)
myWallJSON

1
Nếu danh sách trống, kill sẽ trả về mã lỗi 1 và không giết bất cứ thứ gì. Nó sẽ tương đương với việc cố gắng gọi kill mà không có đối số. Bạn có thể thêm một câu lệnh if để kiểm tra trước nếu pidof trả về một danh sách trống. Nếu nó không trả về một danh sách trống, hãy gọi kill `pidof process_name. Nếu nó trả về một danh sách trống, bỏ qua lệnh gọi.
amandion

0

Script nhỏ tôi đã tạo bằng R & D. tôi hi vọng bạn sẽ thích nó

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

lưu nó với một số tên như script.sh sau đó

chmod +x script.sh
./script.sh

Sau đó cung cấp tên quá trình của bạn.

Lưu ý: Tôi đã thử nhiều lần với nó và nó ổn.


Tôi có thể biết có vấn đề gì với kịch bản này không và đã bỏ phiếu cần một lời giải thích.
rdʒɑ

Không có gì sai với kịch bản này ... +1
WinEunuuchs2Unix

0

Kiểm tra nếu quá trình tồn tại với pidof. Nếu có, giết nó:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

Mã thoát luôn là 0 sau khi thực hiện lệnh trên.


0

Sử dụng pkillvới tùy chọn-f

pkill -f myServer

Tùy chọn -flà mẫu thường được so khớp với tên quy trình.


-1

Tôi sẽ dùng:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

Các xargs -rTell chỉ chạy kill nếu có đầu vào. Đầu ps --no-header -eo pid,cmdra được định dạng tốt hơn để phân tích cú pháp.

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.