import System.Posix.Signals import Control.Concurrent (threadDelay) import Control.Concurrent.MVar termHandler :: MVar () -> Handler termHandler v = CatchOnce $ do putStrLn "Caught SIGTERM" putMVar v () loop :: MVar () -> IO () loop v = do putStrLn "Still running" threadDelay 1000000 val <- tryTakeMVar v case val of Just _ -> putStrLn "Quitting" >> return () Nothing -> loop v main = do v <- newEmptyMVar installHandler sigTERM (termHandler v) Nothing loop v