Hi,
I would like to stop a system call after a timeout, but doing so with
the Timeout library does not kill the process, and the process keeps
running. I think the problem is the system call does a Process.fork and
no way to kill it, no matter if the Thread is stoped.
Is there any way to kill the process? May be getting its pid?
Thanks,
Jordi
···
--
Posted via http://www.ruby-forum.com/.
Jordi Planes wrote:
Hi,
I would like to stop a system call after a timeout, but doing so with
the Timeout library does not kill the process, and the process keeps
running. I think the problem is the system call does a Process.fork and
no way to kill it, no matter if the Thread is stoped.
Is there any way to kill the process? May be getting its pid?
Thanks,
Jordi
I finally come up with my own timeout, using Process instead of Thread.
In case somebody is interested, here it is:
module Timeout
class Error<Interrupt
end
def timeout( sec, exception=Error )
return yield if sec == nil or sec.zero?
pid_execution = Process.fork { begin yield ensure exit! end }
pid_sleep = Process.fork { begin sleep sec ensure exit! end }
if Process.wait == pid_sleep then
Process.kill( 'INT', pid_execution )
raise exception, "execution expired"
else
Process.kill( 'ALRM', pid_sleep )
end
end
module_function :system_call, :timeout
end
···
--
Posted via http://www.ruby-forum.com/\.
This is even nicer:
http://www.jpaisley.com/software/ruby/open4.rb
Good job Jonathan!
Jordi Planes wrote:
···
Jordi Planes wrote:
Hi,
I would like to stop a system call after a timeout, but doing so with
the Timeout library does not kill the process, and the process keeps
running. I think the problem is the system call does a Process.fork and
no way to kill it, no matter if the Thread is stoped.
Is there any way to kill the process? May be getting its pid?
Thanks,
Jordi
I finally come up with my own timeout, using Process instead of Thread.
In case somebody is interested, here it is:
module Timeout
class Error<Interrupt
end
def timeout( sec, exception=Error )
return yield if sec == nil or sec.zero?
pid_execution = Process.fork { begin yield ensure exit! end }
pid_sleep = Process.fork { begin sleep sec ensure exit! end }
if Process.wait == pid_sleep then
Process.kill( 'INT', pid_execution )
raise exception, "execution expired"
else
Process.kill( 'ALRM', pid_sleep )
end
end
module_function :system_call, :timeout
end
--
Posted via http://www.ruby-forum.com/\.