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)
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.