how to terminate an external program after timeout?
Simon Marlow
marlowsd at gmail.com
Mon Sep 13 04:37:07 EDT 2010
On 09/09/2010 17:18, Christian Maeder wrote:
> David Peixotto schrieb:
>> On Sep 9, 2010, at 6:37 AM, Simon Marlow wrote:
>>
>>> On 09/09/2010 10:39, Christian Maeder wrote:
>>>> Christian Maeder schrieb:
>>>>> Hi,
>>>>>
>>>>> we call from our haskell application the metis prover via
>>>>>
>>>>> System.Process.readProcessWithExitCode "metis" filename ""
>>>>>
>>>>> However, we are not able to get rid of this process if metis does not
>>>>> terminate by itself. In particular, wrapping this call into a
>>>>> System.Timeout.timeout does not work.
>>>> timeout works so far as it is possible to start another action, but the
>>>> continuing metis process still blocks the whole system.
>>>>
>>>> C.
>>>>
>>>>> Any suggestions how we should handle this ideally portably but first of
>>>>> all under unix. (ghc-6.12.3)
>>> Take a look at the timeout program in GHC's test suite:
>>>
>>> http://darcs.haskell.org/testsuite/timeout/timeout.hs
>
> This looks pretty complicated. Did no one else needed this? Isn't it
> easier to put the application into a wrapper script and call the script
> from haskell?
>
It is pretty complicated, because properly wrapping a process in a
timeout is a complicated task. You have to:
- kill not just the process you started, but any children it started
- catch ^C, and pass it to the child process(es)
- if the child process died with a signal, arrange that the wrapper
dies with the same signal, so that the parent can see what happened
- try to kill nicely, giving them a chance to clean up, but kill
forcefully if that doesn't work.
It would be a good idea to wrap this up and put it on Hackage, in fact.
Cheers,
Simon
More information about the Glasgow-haskell-users
mailing list