Sự khác biệt giữa tín hiệu tiêu diệt ít bạo lực hơn -HUP (1) -INT (2) và -TERM (15)


32

Ngoài bạo lực nhất kill -9(SIGKILL), tôi hoàn toàn không hiểu sự khác biệt giữa 3 tín hiệu phổ biến khác ( ở đây ) -HUP(1), -INT(2) và -TERM(15).

Trong những kịch bản nào người ta sẽ làm việc và người kia không?

Nói chung khi nào -9( -KILL) thất bại?

Đối với tôi, họ dường như yêu cầu quá trình chấm dứt một cách duyên dáng , mà không cần tiết kiệm . Đánh giá sự khắc nghiệt, tôi sẽ đặt -HUP < -TERM < -INT < -KILL.


HUPkhông nhất thiết có nghĩa là chương trình sẽ bỏ. Một số chương trình sử dụng SIGHUPđể tải lại tập tin cấu hình. SIGKILLthất bại, hay đúng hơn là bị hoãn lại, khi quá trình đang trong giấc ngủ không ngớt .
muru

Câu trả lời:


52

SIGKILL không bao giờ thất bại trong việc giết chết một quy trình đang chạy, đó là điểm chính. Các tín hiệu khác tồn tại để cung cấp cho ứng dụng một cơ hội để phản ứng.

Hành vi mặc định của SIGINT, SIGTERM, SIGQUIT và SIGHUP là giết chương trình. Tuy nhiên, các ứng dụng được phép cài đặt một trình xử lý cho các tín hiệu này. Vì vậy, hành vi thực tế của các ứng dụng khi chúng nhận được các tín hiệu này là vấn đề quy ước (mà mỗi ứng dụng có thể hoặc không thể tuân theo), không phải là thiết kế hệ thống.

SIGINT là người yếu nhất trên thế giới. Ý nghĩa thông thường của nó là, hãy dừng những gì bạn đang làm ngay bây giờ và chờ thêm người dùng nhập vào. Đó là tín hiệu được tạo bởi Ctrl+ Ctrong một thiết bị đầu cuối. Các chương trình không tương tác thường coi nó như SIGTERM.

SIGTERM là tín hiệu tiêu diệt thông thường của người Viking. Nó báo cho ứng dụng thoát sạch. Ứng dụng có thể mất thời gian để lưu trạng thái của nó, vào các tài nguyên miễn phí, chẳng hạn như các tệp tạm thời bị bỏ lại, v.v. Một ứng dụng không muốn bị gián đoạn trong một ứng dụng quan trọng có thể bỏ qua SIGTERM trong một thời gian.

SIGHUP tương tự như SIGTERM về độ khắc nghiệt, nhưng nó có một vai trò cụ thể vì nó tự động được gửi đến các ứng dụng đang chạy trong một thiết bị đầu cuối khi người dùng ngắt kết nối với thiết bị đầu cuối đó (về mặt từ nguyên, bởi vì người dùng đang kết nối qua đường dây điện thoại và modem treo lên). SIGHUP thường không tự nguyện, không giống như SIGTERM phải được gửi một cách rõ ràng, vì vậy các ứng dụng nên cố gắng lưu trạng thái của chúng trên SIGHUP. SIGHUP cũng có một ý nghĩa thông thường hoàn toàn khác đối với các ứng dụng không phải người dùng ( daemon ), đó là tải lại tệp cấu hình của chúng.

SIGQUIT là khắc nghiệt nhất trong các tín hiệu không thể biết được. Nó có nghĩa là được sử dụng khi một ứng dụng hoạt động sai và cần phải bị giết ngay bây giờ, và theo mặc định, nó thường để lại một tệp kết xuất lõi (các hệ thống hiện đại mà hầu hết người dùng sẽ không biết tệp lõi nào có xu hướng không tạo ra chúng theo mặc định) . Các ứng dụng có thể thiết lập trình xử lý nhưng nên thực hiện rất ít (đặc biệt là không lưu bất kỳ trạng thái nào) vì mục đích của SIGQUIT là được sử dụng khi có sự cố nghiêm trọng.


Bạn có thể nói rõ hơn về "lưu trạng thái của họ" không? Nếu tôi đang ở trong một trình soạn thảo văn bản và tôi giết nó, tôi cho rằng nội dung không được lưu.
Kenny

2
@Kenny Hầu hết các biên tập viên sẽ không lưu tệp vì bạn có thể đã thực hiện các sửa đổi tạm thời mà bạn không có ý định lưu. Các biên tập viên nâng cao (ví dụ vi, emacs) có tệp tự động lưu trong đó thỉnh thoảng họ lưu dữ liệu; trên SIGHUP họ thường đảm bảo rằng tệp tự động lưu được cập nhật.
Gilles 'SO- ngừng trở nên xấu xa'
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.