Ich habe versucht, einen Daemon zu machen, der gestoppt wird, indem man ihm ein SIGTERM Signal sendet (wie es für Daemons üblich ist). Der Daemon erwirbt einige Ressourcen, die nach der Ausführung freigegeben werden sollten, und ich wollte dafür eine Klammer verwenden.haskells Klammer auf SIGTERM
Ich bemerkte, dass der Bereinigungsteil der Klammer nicht ausgeführt wird, wenn das Programm mit SIGTERM beendet wird. Dies kann mit diesem Programm wiedergegeben werden:
main = bracket (return "ending")
(\x -> putStrLn x)
(\_ -> threadDelay 10000000000000)
Dieses einfache Programm sollte die Zeichenfolge "ending"
erwerben (der Einfachheit halber nur durch Neuabstimmung) und Druck, die Zeichenfolge erworbenen endet.
Wenn ich das Programm mit ctrl-c abbringe, verhält es sich wie erwartet und gibt "ending" beim Beenden aus, aber wenn ich es mit killall -TERM test
(die ausführbare Datei heißt test) abstempelt, gibt es "Beendet" aus Deutsch), so dass der letzte Teil der Klammer nicht ausgeführt wird.
Ist das ein Fehler oder mache ich etwas falsch?
Ich verwende GHC 7.6.3 und ich bin unter Linux/GNU Debian jessie i386 (i686)
Es scheint, dass ghc behandelt SigTerm anders als andere Ausnahmen. [This] (http://stackoverflow.com/questions/18430748/killing-a-haskell-binary) Frage kann nützlich sein. – user2407038