[GHC] #10081: SIGTERM ignored when process has been detached from terminal
GHC
ghc-devs at haskell.org
Wed Feb 11 16:19:21 UTC 2015
#10081: SIGTERM ignored when process has been detached from terminal
-------------------------------------+-------------------------------------
Reporter: nakal | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: | Version: 7.8.3
libraries/unix | Operating System: FreeBSD
Keywords: | Type of failure: Incorrect result
Architecture: x86_64 | at runtime
(amd64) | Blocked By:
Test Case: | Related Tickets:
Blocking: |
Differential Revisions: |
-------------------------------------+-------------------------------------
I've tried to write a simple Unix daemon that reacts to signals. Here is
the reduced source code sample:
{{{#!hs
import Control.Concurrent
import Control.Monad
import System.Exit
import System.IO
import System.Posix.Signals
loop = forever $ threadDelay 1000000
main = do
ppid <- myThreadId
mapM (\sig -> installHandler sig (Catch $ trap ppid) Nothing)
[ lostConnection, keyboardSignal, softwareTermination,
openEndedPipe ]
loop
trap tid = do
hPutStrLn stderr "Signal received.\n"
throwTo tid ExitSuccess
}}}
Such daemons usually run in background without a terminal attached. I
verified that I can kill the process after being started on the terminal:
{{{
> ./daemon
Signal received.
}}}
With:
{{{
> killall daemon
}}}
in other terminal.
Other test, when I run it in background:
{{{
> ./daemon
(press Ctrl+Z)
> bg
> killall daemon
Signal received.
}}}
This case is also ok. Now the third test which is also OK:
{{{
> ./daemon > log 2>&1
(press Ctrl+Z)
> bg
> exit
}}}
In second terminal:
{{{
> cat log
> killall daemon
> cat log
Signal received.
> killall daemon
No matching processes belonging to you were found
}}}
Now the fourth test which is simply without a log file and this one fails:
{{{
> ./daemon
(press Ctrl+Z)
> bg
> exit
}}}
On some other terminal try to kill the process:
{{{
> killall xxx
> killall xxx
> killall xxx
> killall -9 xxx
> killall xxx
No matching processes belonging to you were found
}}}
Signal 9 (SIGKILL) kills the process hard without the signal trap. That's
why it works, of course, but SIGTERM is being ignored for some reason.
Maybe I am forgetting something, but in my opinion this should end the
process properly, too.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10081>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list