killall không giết tất cả và hiếm khi giết chết, lệnh đó là gì?


12

Tôi thỉnh thoảng sử dụng killalllệnh để giết các tiến trình. Lý do tại sao tôi nói một cách ngẫu nhiên là trong một số trường hợp, nó không hiệu quả với tôi.

Một ví dụ gần đây là với thunderbird nơi có khoảng 5 trường hợp trong bộ nhớ nên tôi quyết định sử dụng killalllệnh. Nó đã giết chết 2 tiến trình và 3 vẫn còn trong bộ nhớ. Đã thử lại và 3 vẫn còn đó.

Vì vậy, tôi đã sử dụng kill -9lệnh thủ công để tiêu diệt từng tiến trình riêng lẻ thông qua các pids của chúng. Điều đó đã làm việc.

Tôi chủ yếu sử dụng kill -9lệnh khi nó hoạt động. Các killalllệnh có làm tôi thất vọng rất nhiều lần tôi chỉ không bận tâm sử dụng nó. Nhưng phải có một lý do tại sao nó không hoạt động. Tôi đang sử dụng nó sai?

Tôi biết có những lệnh khác như thế pkillnhưng tôi sẽ biết ơn tại sao killalllệnh không hoạt động như mong đợi. Tôi thậm chí đã cố gắng để giết chỉ một quá trình và đó là một vụ đánh và bỏ lỡ. Nhưng kill -9lệnh hoạt động mọi lúc.

Có ý kiến ​​gì không?

PS: sudokhông tạo ra sự khác biệt

Câu trả lời:


22

Từ trang man cho killall

killall gửi tín hiệu đến tất cả các tiến trình đang chạy bất kỳ lệnh nào được chỉ định. Nếu không có tên tín hiệu được chỉ định, SIGTERM được gửi.

Khi bạn làm một kill -9, bạn đang gửi tín hiệu SIGKILL. Nếu bạn muốn gửi SIGKILL với killall, bạn cần phải làm

killall -s SIGKILL <PROCESSNAME>

Một lời giải thích tốt về sự khác biệt giữa SIGKILL và SIGTERM (và tại sao bạn nên thử SIGTERM trước)

Từ http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

Gửi tín hiệu đến các quy trình sử dụng kill trên hệ thống Unix không phải là một chủ đề mới đối với hầu hết các quản trị viên hệ thống, nhưng tôi đã được hỏi nhiều lần về sự khác biệt giữa kill và kill -9.

Bất cứ khi nào bạn sử dụng kill trên một tiến trình, bạn thực sự đang gửi tín hiệu cho quá trình (trong hầu hết các tình huống - tôi sẽ sớm xử lý vấn đề đó). Các ứng dụng C tiêu chuẩn có tệp tiêu đề chứa các bước mà quy trình sẽ tuân theo nếu nhận được tín hiệu cụ thể. Bạn có thể nhận được toàn bộ danh sách các tín hiệu khả dụng trên hệ thống của mình bằng cách kiểm tra trang man để tìm.

Hãy xem xét một lệnh như thế này:

kill 2563

Điều này sẽ gửi một tín hiệu gọi là SIGTERM cho quá trình. Khi quá trình nhận được thông báo, một vài điều khác nhau có thể xảy ra:

  • quá trình có thể dừng lại ngay lập tức
  • quá trình có thể dừng lại sau một thời gian trì hoãn ngắn sau khi làm sạch tài nguyên
  • quá trình có thể tiếp tục chạy vô thời hạn

Ứng dụng có thể xác định những gì nó muốn làm sau khi nhận được SIGTERM. Trong khi hầu hết các ứng dụng sẽ dọn sạch tài nguyên của họ và dừng lại, một số có thể không. Một ứng dụng có thể được cấu hình để làm một cái gì đó hoàn toàn khác khi nhận được SIGTERM. Ngoài ra, nếu ứng dụng ở trạng thái xấu, chẳng hạn như chờ vào I / O đĩa, nó có thể không thể hoạt động theo tín hiệu đã được gửi.

Hầu hết các quản trị viên hệ thống thường sẽ sử dụng tín hiệu đột ngột hơn khi ứng dụng không phản hồi SIGTERM:

kill -9 2563

-9 cho biết lệnh kill mà bạn muốn gửi tín hiệu # 9, được gọi là SIGKILL. Với một cái tên như vậy, rõ ràng tín hiệu này mang trọng lượng lớn hơn một chút.

Mặc dù SIGKILL được định nghĩa trong cùng một tệp tiêu đề tín hiệu như SIGTERM, nhưng quá trình này không thể bị bỏ qua. Trên thực tế, quá trình thậm chí còn không nhận ra tín hiệu SIGKILL vì tín hiệu đi thẳng vào kernel init. Tại thời điểm đó, init sẽ dừng quá trình. Quá trình không bao giờ có cơ hội để bắt tín hiệu và hành động trên nó.

Tuy nhiên, hạt nhân có thể không thể giết thành công quá trình trong một số tình huống. Nếu quá trình đang chờ I / O mạng hoặc đĩa, kernel sẽ không thể dừng nó. Quá trình và quá trình zombie bị bắt trong một giấc ngủ không thể gián đoạn cũng không thể bị dừng bởi hạt nhân. Cần phải khởi động lại để xóa các quá trình đó khỏi hệ thống.

Khi bạn gửi killall (SIGTERM) đến các quy trình thunderbird, bạn đã yêu cầu các quy trình đó dừng lại. Một số trong những quy trình đó không hoạt động chính xác (có thể là lý do tại sao bạn cần phải giết chúng ngay từ đầu), vì vậy chúng không thể hoạt động theo tín hiệu SIGTERM.


Bất kỳ suy đoán về lý do tại sao nó chỉ giết một số trường hợp sấm sét?
Meer Borg

@Doogfar Xem bài viết đã chỉnh sửa của tôi (hoặc trang tôi đã liên kết)
tgm4883

Cảm ơn, cũng giải thích tại sao Thunderbird của tôi bị hỏng, giết -9 quá khắc nghiệt
Meer Borg

Vẫn không làm việc luôn.
Craig Hicks

4

killallchấp nhận hầu hết các cú pháp giống như kill. Đặc biệt, không cần phải viết bất cứ thứ gì lạ mắt để killalllàm tương đương kill -9. Điều này hoạt động tốt:

killall -9 thunderbird

(Tất nhiên, như đã thảo luận, bạn thường nên miễn cưỡng sử dụng killall -9hoặc, tương tự killall -KILL, trừ khi các biện pháp khác đã được thử mà không thành công.)


Vẫn không hoạt động luôn vì vậy phải có một cái gì đó khác.
Craig Hicks
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.