Tại sao tôi không nên sử dụng 'kill -9' / SIGKILL


14

Đăng câu hỏi này vì tôi ngạc nhiên khi không tìm thấy nó trả lời trực tiếp; xin lỗi nếu đây là một bản sao - tôi đã nhìn!

Tôi đã nghe điều đó kill -9hoặc kill -SIGKILLlà xấu, nhưng tôi không hiểu tại sao. Nếu tôi không nên kill -9nên tôi làm gì để giết một quá trình?


2
Tiền đề của câu hỏi là sai. SIGKILL chỉ là một công cụ. Nó được khuyến nghị trong một số tình huống và không được khuyến nghị trong các tình huống khác (như tất cả các công cụ khác).
kubanchot

@kubanchot chắc chắn, nhưng nó là một công cụ bị áp dụng sai và được sử dụng mà không hiểu mục đích của nó. Tôi đã thấy nhiều chủ đề trong đó A nói " Chỉ là kill -9 ", OP nói " tuyệt vời, nó đã hoạt động! Tôi sẽ nhớ điều đó từ bây giờ! ", Và B đến để cảnh báo " chờ đợi kill -9là nguy hiểm! " Chỉ sau khi thực tế.
dimo414

Câu trả lời:


15

SIGKILLkéo tấm thảm ra khỏi quá trình chạy của bạn, chấm dứt nó ngay lập tức. Đối với các chương trình rất đơn giản, điều này là tốt; trong thực tế tuy nhiên có rất ít chương trình "đơn giản".

Dưới vỏ bọc, ngay cả các chương trình có vẻ tầm thường cũng làm tất cả các loại công việc giao dịch mà chúng cần phải dọn sạch trước khi chấm dứt (nghĩ về finallykhối trong Java và các ngôn ngữ lập trình khác), chẳng hạn như đóng tài nguyên xử lý, xóa các tệp tạm thời và xóa dữ liệu khỏi bộ nhớ vào đĩa. Bạn không thể lường trước được khi nào một chương trình có thể làm điều gì đó như thế này.

Nếu bạn may mắn, bạn sẽ không nhận thấy bất cứ điều gì không ổn nếu bạn gửi SIGKILL, nhưng bạn không thể may mắn mãi mãi và bạn có thể không biết bất cứ điều gì sai trái cho đến khi quá muộn để khôi phục những gì đã mất.

Bạn gần như không bao giờ cần phải gửi một SIGKILL, và bạn nên chắc chắn rằng bạn đã sử dụng hết các lựa chọn thay thế trước khi thực hiện. Trong nhiều trường hợp, việc khởi động lại (cuối cùng sẽ gửi SIGKILLs đến các chương trình hoạt động sai) sẽ an toàn hơn so với việc tự gửi một cách thủ công SIGKILL. Tôi có thể có thể đếm bằng một tay số lần tôi cần để gửi SIGKILL(và có thể là tất cả các sản phẩm của riêng tôi).

Nói chung, bạn có thể sử dụng Ctrl+ C(sẽ gửi quá trình tiền cảnh a SIGINT) hoặc SIGTERM(như trong "chấm dứt") để hướng dẫn một quy trình dừng những gì nó đang làm và thoát.

Một số đọc thêm:

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.