2015-03-18 20 views
6

Tôi đã cố gắng để làm cho một daemon được dừng lại bằng cách gửi cho nó một tín hiệu SIGTERM (như nó là bình thường cho daemon). Các daemon mua lại một số tài nguyên cần được giải phóng sau khi chạy và tôi muốn sử dụng khung để làm như vậy.haskells bracket trên SIGTERM

Tôi nhận thấy rằng phần làm sạch của khung không chạy khi chương trình kết thúc bằng SIGTERM. Điều này có thể được sao chép với chương trình này:

main = bracket (return "ending") 
     (\x -> putStrLn x) 
     (\_ -> threadDelay 10000000000000) 

chương trình đơn giản này nên có được chuỗi "ending" (vì đơn giản chỉ bằng cách retuning nó) và in mà mua chuỗi trên kết thúc.

Khi tôi ngắt chương trình bằng ctrl-c, nó hoạt động như mong đợi và in "kết thúc" khi thoát, nhưng khi tôi giết nó bằng killall -TERM test (tệp thực thi được đặt tên), nó in "Beendet" ("Đã kết thúc" trong Đức), vì vậy phần cuối cùng của khung không chạy.

Đây có phải là lỗi hoặc tôi đang làm điều gì sai?

Tôi đang sử dụng GHC 7.6.3 và tôi đang chạy trên Linux/GNU Debian jessie i386 (i686)

+3

Dường như đối xử với GHC SIGTERM khác so với trường hợp ngoại lệ khác. [This] (http://stackoverflow.com/questions/18430748/killing-a-haskell-binary) câu hỏi có thể hữu ích. – user2407038

Trả lời

1

Nói chung, tín hiệu bên ngoài không được biến thành ngoại lệ và thông qua vào chương trình (đối với một, trong một chương trình đa luồng, luồng nào sẽ bắt chúng?), nhưng thay vào đó được xử lý trực tiếp bởi RTS.

Nếu bạn muốn nghe cho một tín hiệu bên ngoài và phản ứng với nó, quá trình thích hợp của hành động là để gọi installHandler từ gói unix: http://hackage.haskell.org/package/unix-2.7.1.0/docs/System-Posix-Signals.html

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