2015-03-18 17 views
6

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)

+3

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

Antwort

1

Im Allgemeinen werden externe Signale nicht in Ausnahmen eingeschaltet und auf das Programm übergeben (für ein, in einem Multithread-Programm, welcher Thread würde sie fangen?), sondern stattdessen direkt von der RTS behandelt werden.

Wenn Sie ein externes Signal hören möchten und reagieren darauf, die richtige Handlungsweise ist installHandler aus dem Unix-Paket zu nennen: http://hackage.haskell.org/package/unix-2.7.1.0/docs/System-Posix-Signals.html

Verwandte Themen