2012-03-29 40 views

Trả lời

13

Không có gì. Bản thân Python không đăng ký trình xử lý tín hiệu cho nó. Bạn có thể kiểm tra điều này trong phiên dịch tương tác:

>>> import signal 
>>> signal.signal(signal.SIGTERM, signal.SIG_DFL) 
0 
>>> signal.SIG_DFL 
0 

Điều đó cho thấy signal.signal() trở signal.SIG_DFL cho signal.SIGTERM. Ngược lại nó với signal.SIGINT, mà không có một tín hiệu điều khiển mặc định (điều này làm tăng KeyboardInterrupt):

>>> signal.signal(signal.SIGINT, signal.SIG_DFL) 
<built-in function default_int_handler> 
+4

Điều này cũng có nghĩa là các hàm được đăng ký thông qua 'atexit.register()' sẽ không được gọi nếu quá trình được kết thúc bằng 'SIGTERM'. –

+5

Ok, nhưng nó làm gì? Thoát khỏi ô uế? Bỏ qua nó hoàn toàn? Thứ gì khác? – Lucretiel

5

Dựa trên câu trả lời của Thomas Wouters, trăn không đăng ký một handler cho tín hiệu SIGTERM. Chúng ta có thể thấy điều này bằng cách thực hiện:

In[23]: signal.SIG_DFL == signal.signal(signal.SIGTERM,signal.SIG_DFL) 
Out[23]: True 

Điều đó có nghĩa rằng hệ thống sẽ có những hành động mặc định. Trên Linux, hành động mặc định (theo the signal man page) cho SIGTERM là chấm dứt quá trình.

Chấm dứt một quá trình có nghĩa là:

  • quá trình này sẽ đơn giản là không được phân bổ bất kỳ thời gian hơn lát trong thời gian đó nó có thể thực thi mã.

    • Điều này có nghĩa rằng nó sẽ không tăng ngoại lệ, hoặc gọi các mã trong thử: cuối cùng: khối, hoặc thoát phương pháp quản lý nội dung. Nó sẽ không làm những điều đó bởi vì trình thông dịch python cụ thể đó sẽ không bao giờ có cơ hội thực hiện một lệnh khác.
  • Bộ nhớ của quá trình và các tài nguyên khác (tệp mở, ổ cắm mạng, v.v ...) sẽ được phát hành trở lại phần còn lại của hệ thống.

+0

Điều này đúng, quan trọng và - ít nhất là với tôi - không trực quan. Tôi nghĩ toàn bộ doanh nghiệp của các mệnh đề cuối cùng và phương thức \ __ exit__ của người quản lý ngữ cảnh là đảm bảo mã được đề cập luôn chạy (ngoại trừ SIGKILL, mà tôi biết là được xử lý ở cấp hệ thống). Đấu tranh vài ngày với điều này và bây giờ chỉ đến nhận thức rằng bạn đã trình bày ở đây trong câu trả lời của bạn. Tôi cần ghi nhớ điều này. – matlehmann

Các vấn đề liên quan