Khi bạn cố gắng chấm dứt một quá trình cho tốt, bạn nên sử dụng tùy chọn nào cho việc giết chết Kill?


26

Tôi nhận được rất nhiều tin nhắn hỗn hợp từ mọi người, và tự hỏi liệu nó thực sự không có nhiều sự khác biệt trong những gì bạn sử dụng.

kill 'x'
killall 'x'
kill -9 'x'

Đây là một số tùy chọn mà tôi được cho là sử dụng cho đến nay, nhưng một số người nói rằng kill -9 chỉ là quá mức cần thiết, tự nó không hoạt động, v.v.

Có ai có lời khuyên nào về việc nên sử dụng cái nào trong trường hợp tiêu chuẩn nhất là chỉ chấm dứt một quá trình (và do đó cũng là trạng thái của nó) không?

[sửa] Tôi đang tìm kiếm những gì sẽ sử dụng khi bạn muốn dừng việc thực hiện quy trình của mình để bạn có thể chạy một quy trình mới, mới từ đầu


1
Xem thêm thư mẫu UUK9 cảnh báo chống lạm dụng SIGKILL.
jw013

1
Để liệt kê tất cả các tín hiệu khác nhau, cùng với số của chúng: kill -lvà để dịch một số sang tên tín hiệu tương ứng, ví dụ như kill -l 9sẽ trả về KILL.

Câu trả lời:


24

Có một số tín hiệu có khuynh hướng mặc định là chấm dứt quá trình. Tín hiệu kết thúc cuối cùng là SIGKILL vì nó không thể được xử lý và quá trình không có lựa chọn nào khác ngoài việc chết. Tuy nhiên, điều này cũng có nghĩa là nếu bạn gửi nó, quá trình này sẽ không có cơ hội để dọn dẹp. Do đó, cách cư xử tốt yêu cầu gửi tín hiệu như SIGTERM có thể được xử lý trước và chỉ khi quá trình không thoát sau một thời gian gửi SIGKILL.

Lưu ý rằng SIGINT và SIGQUIT không phải là ứng cử viên tốt cho việc chấm dứt quá trình tùy ý. Do thực tế là chúng có thể được tạo từ bàn phím của thiết bị đầu cuối, nhiều ứng dụng sử dụng chúng cho các mục đích đặc biệt. Ví dụ, trình thông dịch python sử dụng SIGINT để tạo KeyboardInterruptngoại lệ (cũng trong các phiên python tương tác nơi nó chỉ đơn giản trở về dấu nhắc) và JVM sử dụng SIGQUIT để kết xuất dấu vết ngăn xếp. SIGINT và SIGQUIT vẫn duy trì hiệu quả đối với hầu hết các tiện ích dòng lệnh tiêu chuẩn như findhoặc cat.

Trong quá trình tắt hệ thống, hầu hết các hệ thống UNIX và Linux đều gửi SIGTERM cho tất cả quá trình, sau 5 giây chờ đợi, sau đó là SIGKILL. Đây là cách được khuyến nghị để tắt một cách an toàn một quy trình tùy ý.

Cũng lưu ý rằng ngay cả SIGKILL cũng không thể chấm dứt một quá trình bị mắc kẹt trong sự chờ đợi không bị gián đoạn cho đến khi quá trình thức dậy.


1
Câu trả lời tuyệt vời. Bạn có một tài liệu tham khảo cho các kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;khuyến nghị?
l0b0

+1 loại câu trả lời. Còn SIGHUP thì sao?
Alois Mahdal

2
@AloisMahdal: SIGHUPxuất phát từ ngày mà các dòng quay số là phổ biến. Tín hiệu đó đã được gửi để chỉ ra rằng dòng bị treo. Sau này, khi điều đó ít phổ biến hơn, SIGHUPđôi khi được sử dụng bởi daemon để đọc lại tệp cấu hình mà không cần khởi động lại quá trình. Trong thời hiện đại SIGHUPnày hiếm khi được sử dụng. Nhiều daemon sẽ có cách tái khởi động riêng (nghĩa là apachectl gracefulhoặc rndc reconfig. Đối với những thứ không nên sử dụng [init.d|smf|upstart|launchd]điều khiển nếu có thể.
bahamat

13

Bạn nên bắt đầu với cái nhẹ nhàng nhất và leo thang từ đó. Điều này có nghĩa là, SIGINT, SIGTERM, SIGQUIT, SIGKILL. Mặc dù hầu hết mọi người bỏ qua SIGINT và SIGQUIT.


Ngoài ra, một số ứng dụng (như JDK) xử lý SIGQUIT khác nhau. Tôi có thể sẽ không sử dụng SIGQUIT mà không biết ứng dụng cụ thể xử lý nó như thế nào.
dimo414
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.