Làm thế nào tôi có thể giết tất cả các công việc đã dừng?


91

Khi tôi cố gắng thoát khỏi máy chủ Linux của mình, tôi nhận được thông báo:

Có những công việc bị dừng lại.

: Có một lệnh duy nhất để giết những thứ này không?


Các ví dụ bổ sung trong câu hỏi và trả lời của bạn: unix.stackexchange.com/questions/124428/
slm

Bây giờ tôi đã có vấn đề ngược lại, nó sẽ không cảnh báo về việc dừng hoạt động khi tôi bỏ vỏ! Phải đưa shopt -s checkjobsvào .bashrc của tôi
Sam Watkins

1
nhấn ctrl + d lần nữa, nó sẽ cho phép bạn thoát ngay bây giờ, giết chết những công việc đó trong quá trình
Jens Timmerman

Câu trả lời:


73

Để nhanh chóng tiêu diệt tất cả các công việc đã dừng dưới bash, hãy nhập:

kill -9 `jobs -ps`

jobs -psliệt kê ID tiến trình ( -p) của các công việc đã dừng ( -s).
kill -9 `jobs -ps`gửi tín hiệu SIGKILL cho tất cả chúng.


22
-1 cho "giết Jobs"

1
đã không làm việc khi công việc là "sudo su". tức là không sudo kill `jobs -p`hoạt động nhưng rõ ràng gõ PID đã làm.
dùng13107

14
Tại sao điều này được nâng cao như vậy? Nó sai. Nếu các quy trình bị dừng, thì một quy trình killnhư vậy sẽ không làm gì cả, vì các quy trình bị dừng, chúng sẽ không xử lý SIGTERM (-15) được gửi theo mặc định.
slm

6
giết -9 sẽ làm trò bịp
gian biểu

84

Hãy thử gõ này:

kill -9 $(jobs -p)

9
Điều đó sẽ làm điều đó, nhưng tôi nghĩ rằng anh ta nên gửi SIGTERM trước tiên (-15) trước khi gửi SIGKILL (-9). Vì vậy, có lẽ đề xuất một cái gì đó như "kill $ (jobs -p); ngủ 3s; kill -9 $ (jobs -p)" sẽ tốt hơn. Gửi SIGTERM trước tiên các công việc có thể thực hiện một lối thoát sạch (giải phóng tài nguyên được phân bổ, v.v.).
rems 25/211

3
Kevin Duke, câu trả lời của bạn là câu trả lời cho tôi. Tôi không thể bỏ phiếu vì tôi không có 15 danh tiếng. giết -9 $ (công việc -p)

2
@rems Ngoại trừ, như slm đã chỉ ra, họ sẽ không nhận được SIGTERM vì họ đã dừng lại.
Paul Gear

1
Không hoạt động trên zsh. Do zsh không tuân thủ POS IX với công việc .
Tối đa Coplan

Sau đó, làm thế nào để đối phó với zsh?
fx-kirin

16

Câu trả lời được chấp nhận sẽ giết chết tất cả các công việc (trong trường hợp này là đủ) và không chỉ những công việc bị dừng lại. Nếu bạn chỉ muốn giết những người đã dừng, hãy chạy:

kill $(jobs -l | grep Stopped | cut -d' ' -f3)

grep / cut có thể được kết hợp trong một lệnh awk: awk '/Stopped/{print $3}')
laebshade

2
các -stranh luận về các bộ lọc chấp nhận câu trả lời chỉ là những người dừng lại
79E09796

12

Cách dễ nhất là thực sự đơn giản là thử lại ngay lối thoát; bashsẽ coi điều đó có nghĩa là "giết tất cả các công việc đã dừng và thoát".


4
Điều đó sẽ gửi HUP mà không nhất thiết phải dừng bất kỳ công việc nào.
Stephen Niedzielski

7
for x in `jobs -p` ; do kill -9 $x ; done

2
bạn có thể thêm định dạng mã cho dòng này để dễ đọc hơn.
drcelus

Bạn có thể xem lại định dạng của mình không - sử dụng bốn khoảng trắng ở đầu dòng để đánh dấu một khối là mã (thay vì sử dụng backtick). Ngay bây giờ vẫn chưa rõ liệu bạn đang sử dụng backticks trong mã của mình hay đang cố hiển thị mã bằng backticks.
dunxd

Các định dạng là tốt. chúng ta phải vượt qua các công việc -p bằng cách sử dụng backticks nếu không nó sẽ coi đó là một lệnh và nó sẽ gây ra lỗi.
monu

5

Chỉ trong trường hợp điều này giúp người khác - hầu hết mọi người đang ở đây vì họ có một số quy trình đã dừng mà họ đã bắt đầu, có thể thông qua nền tảng. Tôi cần tìm các tiến trình, với quyền root, bị chặn bởi những người dùng khác, trong đó các biến thể của jobslệnh sẽ không được thực hiện.

Một chút đào bới xung quanh man psđã đưa tôi đến đây:

ps -a -o pid,user,cmd,state | grep 'T$'

Giải thích: -acờ cho biết hiển thị tất cả các quy trình, sau đó -okiểm soát đầu ra, thông tin nào sẽ được hiển thị về mỗi quy trình. Tôi chọn pid, user, cmd(dòng lệnh), và state, đó là trạng thái quá trình .

Từ man ps:

PROCESS STATE CODES
   Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
   state of a process:
           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped, either by a job control signal or because it is being traced
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by its parent

Vì vậy, cuối cùng tôi đưa nó vào grep T$đó, cho tôi thấy tất cả các quy trình có T trong cột cuối cùng.

Và sau đó tôi có một danh sách đẹp về tất cả các quy trình từ những người dùng khác nhau đang ở trạng thái dừng.

$ ps -a -o pid,user,cmd,state | grep 'T$'
  865 joson74+ python                      T
  885 joson74+ sh -c less                  T
  886 joson74+ less                        T
 1014 minames+ python3.4 -i /home/minames  T
 5352 MooKo    nano stdio.h                T
 7851 harry    tmux attach                 T
12083 harry    tmux attach                 T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d   vim                         T
19664 enythin+ python                      T
24906 wardlist python                      T

Để có được các công việc dừng lại gắn liền với shell hiện tại, jobs -psđơn giản hơn câu trả lời này. Điều đó đang được nói, câu trả lời này không chỉ hiển thị các công việc được dừng Ctrl-Ztrong một trình bao, nhưng tất cả các công việc đã dừng: các trình bao khác, các người dùng khác , bao gồm các công việc đang được gỡ lỗi (ví dụ: gdb).
Stéphane Gourmetichon

Đối với tôi câu trả lời tốt nhất, nhưng không chính xác làm việc. Tôi đã phải sử dụng ps -el | grep Tđể tìm các quy trình ở trạng thái 'T'.
dr0i

4

Nếu bạn muốn xóa một số công việc đã dừng nhưng không phải tất cả, hãy thử điều này:

Đầu tiên, liệt kê các công việc, bạn sẽ nhận được một cái gì đó như thế này:

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

gửi kill đến một công việc đã dừng, nó sẽ không làm gì ngoài việc xếp hàng hơn là đưa nó vào trong foreground, nó sẽ chấm dứt

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4

Thông thường nếu bạn nhận được thông báo đó, bạn cần đăng xuất hai lần. Ví dụ: đầu tiên Ctrl+Dcung cấp cho bạn thông báo cảnh báo để thông báo cho bạn về các công việc đã dừng, nhấn lần thứ hai sẽ đăng xuất bạn giết chết các công việc. Điều này tương tự áp dụng cho logoutexitcác lệnh.

Để giết chúng bằng tay, hãy thử : kill $(jobs -p).


Nếu bạn không muốn giết công việc khỏi vỏ hiện tại của mình, bạn có thể xóa chúng khỏi bảng công việc đang hoạt động mà không cần giết bằng cách sử dụng disownlệnh. Ví dụ

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown

Các công việc bị dừng cũng có thể được xác định bởi trạng thái của quá trình ( Tký tự) có nghĩa là quá trình bị dừng bởi tín hiệu như SIGSTOP, SIGTSTPhoặc khác (như SIGTTIN, hoặc SIGTTOU).

Trong trường hợp khi jobsmột lệnh dựng sẵn shell không có sẵn, các quy trình bị dừng có thể được liệt kê bằng lệnh sau:

ps wuax | awk '$8 ~ "T"'

Để tiêu diệt tất cả, về cơ bản bạn có thể gõ:

kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

Đây là một bài kiểm tra đơn giản:

$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1]   Stopped                 sleep 1000
[2]   Stopped                 sleep 1000
[3]   Stopped                 sleep 1000
[4]   Stopped                 sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vagrant   2014  0.0  0.0   7228   832 pts/0    T    20:38   0:00 sleep 1000
vagrant   2015  0.0  0.0   7228   708 pts/0    T    20:38   0:00 sleep 1000
vagrant   2016  0.0  0.0   7228   760 pts/0    T    20:38   0:00 sleep 1000
vagrant   2017  0.0  0.0   7228   828 pts/0    T    20:38   0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1]   Killed                  sleep 1000
[2]   Killed                  sleep 1000
[3]   Killed                  sleep 1000
[4]   Killed                  sleep 1000
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.