Làm thế nào để tôi giết tác vụ nền được sinh ra cuối cùng trong linux?
Thí dụ:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Làm thế nào để tôi giết tác vụ nền được sinh ra cuối cùng trong linux?
Thí dụ:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Câu trả lời:
Có một biến đặc biệt cho điều này trong bash:
kill $!
$! mở rộng tới PID của quá trình cuối cùng được thực hiện trong nền.
^Z
không phải công việc nền, nó dừng lại. Sau đó bg
, 'nền' thực tế (tiếp tục thực hiện trong nền) và sau đó $!
hoạt động như mong đợi.
????
là viết tắt của một hoặc nhiều lệnh được thực thi sau khi hủy, nếu bất kỳ lệnh nào phụ thuộc vào công việc được thực hiện bởi quá trình nền, hãy chú ý đến bất kỳ tác vụ dọn dẹp hoặc hoàn thiện nào mà quá trình nền có thể thực hiện trong trình xử lý tín hiệu sau nhận được tín hiệu (bẫy). Tốt nhất để thêm một wait
(có lẽ là theo a sync
hoặc thậm chí a sleep <n>
) ngay trước lệnh đầu tiên của bất kỳ lệnh 'phụ thuộc' nào như vậy.
Bạn có thể giết theo số công việc. Khi bạn đặt một tác vụ trong nền, bạn sẽ thấy một cái gì đó như:
$ ./script &
[1] 35341
Đó [1]
là số công việc và có thể được tham chiếu như:
$ kill %1
$ kill %% # Most recent background job
Để xem danh sách các số công việc, sử dụng jobs
lệnh. Thêm từ man bash
:
Có một số cách để đề cập đến một công việc trong vỏ. Nhân vật
%
giới thiệu một tên công việc. Số công việcn
có thể được gọi là%n
. Một công việc cũng có thể được gọi là sử dụng tiền tố của tên được sử dụng để bắt đầu nó hoặc sử dụng một chuỗi con xuất hiện trong dòng lệnh của nó. Ví dụ,%ce
đề cập đến mộtce
công việc đã dừng lại . Nếu một tiền tố phù hợp với nhiều công việc, bash báo lỗi.%?ce
Mặt khác, sử dụng để chỉ bất kỳ công việc nào chứa chuỗice
trong dòng lệnh của nó. Nếu chuỗi con khớp với nhiều công việc, bash báo lỗi. Các biểu tượng%%
và%+
đề cập đến khái niệm của shell về công việc hiện tại, đây là công việc cuối cùng dừng lại khi nó ở phía trước hoặc bắt đầu trong nền. Các công việc trước đây có thể được tham chiếu bằng cách sử dụng%-
. Trong đầu ra liên quan đến các công việc (ví dụ: đầu ra của lệnh công việc), công việc hiện tại luôn được gắn cờ với a+
và công việc trước đó với a-
. Một đơn%
(không có đặc điểm công việc đi kèm) cũng đề cập đến công việc hiện tại.
set -m
), nhưng nó dành cho sử dụng tương tác. Xem stackoverflow.com/questions/690266/ cũng như
%1
và %%
đặc biệt. Một số thứ không chết trên Ctrl-C, vì vậy bạn cần Ctrl-Z và sau đó kill -9 %%
. Một ví dụ mà tôi thấy nó hữu ích là: while true; do mplayer <some unstable online radio>; date >> restarts.log; done
- Ctrl-C sẽ đưa bạn đến vòng lặp tiếp theo. Trước khi tôi phải làm ps
hoặc có thể jobs -l
, và sau đó gõ lại PID, điều này thật tẻ nhạt.
while true
bằng while sleep 1
. Điều này sẽ cung cấp cho bạn một độ trễ ngắn trước khi khởi động lại nếu bạn có thể sống với điều đó và nếu bạn nhấn ctrl-c hai lần, lần thứ hai sẽ làm gián đoạn giấc ngủ, kết thúc nó bằng một lối thoát khác không và thoát ra khỏi vòng lặp.
Điều này sẽ giết tất cả các quá trình nền:
jobs -p | xargs kill -9
kill -9 %%
ít gõ hơn :)
Đây là một câu trả lời ngoài chủ đề, nhưng, đối với những người quan tâm, nó có thể có giá trị.
Như trong câu trả lời của @John Kugelman,% có liên quan đến đặc tả công việc. Làm thế nào để tìm thấy hiệu quả? sử dụng lệnh & mô hình ít hơn , dường như con người sử dụng ít máy nhắn tin hơn (không chắc chắn), trong kiểu bash man &% thì gõ Enter sẽ chỉ hiển thị các dòng có chứa '%', để đặt lại tất cả, nhập &. sau đó nhập.
Chỉ cần sử dụng lệnh killall:
tên nhiệm vụ
để biết thêm thông tin và các tùy chọn nâng cao hơn, hãy nhập "man killall".
killall python
hoặc killall java
, trong khi có một cái gì đó hữu ích đang chạy ở mọi nơi trong hệ thống.