SIGTERM上的haskells支架

时间:2015-03-18 22:38:28

标签: haskell exception-handling signals

我一直试图通过发送一个SIGTERM信号来制作一个守护进程(就像通常用于守护进程一样)。守护进程获取了一些应该在运行后释放的资源,我想使用括号来执行此操作。

我注意到当程序以SIGTERM终止时,括号的清理部分不会运行。这可以通过以下程序重现:

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

这个简单的程序应该获取字符串"ending"(为了简单起见,只需重新调整它)并在结束时打印获取的字符串。

当我用ctrl-c中断程序时,它表现得像预期的那样,打印"结束"在退出时,但当我用killall -TERM test(可执行文件命名为test)杀死它时,它会打印#34; Beendet" ("结束"德语),所以括号的最后部分没有运行。

这是一个错误还是我做错了什么?

我使用GHC 7.6.3并且我在Linux / GNU Debian jessie i386(i686)上运行

1 个答案:

答案 0 :(得分:1)

通常,外部信号不会变成异常并传递给程序(对于一个,在多线程程序中,哪个线程会捕获它们?),而是由RTS直接处理。

如果您想收听外部信号并做出反应,正确的做法是从unix包中调用installHandlerhttp://hackage.haskell.org/package/unix-2.7.1.0/docs/System-Posix-Signals.html