Giết tất cả các công việc nền


63

Có một hình thức giết chết công việc nhỏ gọn hơn:

for i in {1..5}; do kill %$i; done

Ngoài ra, {1..5} rõ ràng có số ma thuật được mã hóa cứng trong đó, làm cách nào tôi có thể biến nó thành "N" với N là số đúng, mà không cần thực hiện:

$(jobs | wc -l)

Tôi thực sự sử dụng \ j trong PS1 để nhận # công việc được quản lý, điều này có tương đương không?


3
kill $(jobs -p)có vẻ dễ dàng hơn
jw013

Tôi muốn giết công việc cá nhân, nếu có thể. (Tuy nhiên, tôi có thể đã hiểu nhầm nhận xét của bạn)
Robottinosino

for pid in $(jobs -p); do kill $pid; done?
jw013

3
@ jw013 Không chỉ dễ dàng hơn, nó thực sự chính xác (vui lòng đăng nó dưới dạng câu trả lời), không giống như một giải pháp dựa trên việc đếm các dòng đầu ra jobschỉ hoạt động nếu các công việc xảy ra được đánh số liên tiếp. Ồ, và giết chết các công việc riêng lẻ thì vô nghĩa: truyền nhiều PID cho killlệnh thực hiện chính xác điều tương tự như chuyển chúng riêng rẽ.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã nhập lệnh không chính xác, giết các từ $ (jobs -p) và trông cũng rất đúng với tôi. Sẵn sàng chấp nhận.
Robottinosino

Câu trả lời:


102

Để killtất cả các công việc nền được quản lý bởi bash, làm

kill $(jobs -p)

Lưu ý rằng vì cả hai jobskillđược tích hợp vào bash, bạn không nên gặp bất kỳ lỗi nào trong danh sách Đối số loại quá dài .


2
Ngoài ra đối với hậu thế, những gì bahamat nghĩ là cách để làm điều đó trong zshviệc loại bỏ họ như bất kỳ cơ quan nào về chủ đề này.
Peth

Tôi cảm thấy mình nên biết điều này, nhưng '$' hoạt động ở đây như thế nào?
fersarr

1
@likearr Ở đây bạn đi
jw013 8/1/2015

@bahamat Điều đó không thực sự hoạt động vì PID có thể nằm trong trường 2 hoặc 3 tùy thuộc vào việc công việc là một trong% + hay% - hay không. Những gì hoạt động là kill %${(k)^jobdirs}, mà thực sự là lâu hơn; nếu bạn cần liệt kê các PID thì bạn có thể sử dụng lâu hơn nữa ${${jobstates#*:*:}%%=*}.
Gilles 'SO- ngừng trở nên xấu xa'

Trên CentOS, lời nhắc của tôi đang chờ thêm thông tin>
Janac Meena

15

Sử dụng xargsthay cho $(jobs -p)tiểu ban, vì nếu jobs -ptrống thì lệnh kill sẽ thất bại.

jobs -p | xargs kill

1
Điều này cũng có tác dụng chính xác tương tự, nó in trợ giúp và thoát với mã 123
mèo

1
Lệnh hoạt động tốt trên OSX nhưng không hoạt động trên Debian
brunocascio

Điều này hoạt động rất tốt trên CentOS 6
Janac Meena

jobs -p | xargs -rn10 killsẽ làm tốt hơn nếu jobs -pkhông trả lại bất kỳ PID nào. Lưu ý rằng -rtùy chọn là phần mở rộng GNU.
NarnasK

Như đã đề cập ở trên, -rđịnh dạng ngắn cho --no-run-if-emptyphần mở rộng GNU để xargshướng dẫn nó không chạy lệnh nếu stdin không có dữ liệu.
Anthony G - công lý cho Monica

3

Tôi thích kiểm tra xem có công việc nào tồn tại trước khi giết chúng không - theo cách này kịch bản sẽ không thất bại nếu không có gì chạy.

Nó cũng ngắn hơn để gõ. Ném cái này vào .bash_profile:

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

Sau đó chạy:

killjobs

Để giết bất kỳ công việc đang chạy.


1

Tôi có một số lệnh ghép nền mà tôi muốn kết thúc một cách duyên dáng, bằng cách gửi SIGINT cho mỗi quy trình, trên macOS. Không có giải pháp nào khác hoạt động tốt cho điều đó, vì vậy tôi đã đưa ra điều này:

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -p liệt kê các quá trình nền bắt đầu bởi shell hiện tại.

xargs -n1 thực hiện pkill một lần cho mỗi công việc.

pkill -SIGINT -g gửi SIGINT (giống như ctrl + c) cho tất cả các quy trình trong nhóm quy trình.


1

Tôi đoán tùy thuộc vào những gì đầu ra jobs -pcho, giải pháp có thể hơi khác nhau. Trong trường hợp của tôi

$ jobs -p
[1]  - 96029 running    some job
[2]  + 96111 running    some other job

Do đó, làm như sau là không tốt.

$ jobs -p | xargs kill
kill: illegal process id: [1]

Mặt khác, chạy kill $(jobs -p)không hoạt động nhưng đòi hỏi rất nhiều thông báo lỗi, vì các chuỗi không phải là PID cũng được chuyển đến kill.

Do đó, giải pháp của tôi là grepsử dụng PID trước và sau đó sử dụng xargs, như sau:

$ jobs -p | grep -o -E '\s\d+\s' | xargs kill

1
Bạn đang sử dụng vỏ gì? Không echo $0thể hiện điều gì? Không help jobsthể hiện điều gì? Đầu ra được minh họa là không tuân thủ POSIX ; bất kỳ thực hiện jobsnên có một -ptùy chọn với hành vi dự định.
Wildcard

1
Cảm ơn đã chỉ ra điều này. Tôi đang sử dụng zsh, và đó là lý do cho đầu ra lạ. Tôi đã chuyển sang bash và jobs -pchỉ xuất ra PID. Tôi mới biết rằng zsh không hoàn toàn tuân thủ POSIX.
Fanchen Bao

0

Có vẻ như jobs -p | xargs killcông việc, tuy nhiên nó tạo ra một số đầu ra không mong muốn được giết chết. Ở đây tôi đang nhóm đầu ra jobs -pbằng cách có / không có + hoặc - ký tự

function killjobs() {
    JOBS=$(jobs -p)
    echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
    echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}

Và sau này bạn có thể gọi killjobs

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.