Detecting a hung/stalled child process

#1

Hi all

I need to be able to start an external process (as one might do by
using backquotes, e.g. `ls some-dir`) but then kill that process some
time later if it has not completed. I cannot assume that the program I
call will ever complete (i.e. it potentially has an infinite loop), so
I want to be able to let the program run for 4000 microseconds (or
whatever) and if it hasn't completed, kill it.

I'd be very grateful if anyone could advise me on how to do this. It
would be desirable if the solution was as platform-neutral as possible.

Many thanks in advance.

Chris

(Joel VanderWerf) #2

junk5@microserf.org.uk wrote:

Hi all

I need to be able to start an external process (as one might do by
using backquotes, e.g. `ls some-dir`) but then kill that process some
time later if it has not completed. I cannot assume that the program I
call will ever complete (i.e. it potentially has an infinite loop), so
I want to be able to let the program run for 4000 microseconds (or
whatever) and if it hasn't completed, kill it.

I'd be very grateful if anyone could advise me on how to do this. It
would be desirable if the solution was as platform-neutral as possible.

Many thanks in advance.

Chris

Someone just put a fork-based library for this on RAA:
  http://raa.ruby-lang.org/project/forkedtimeout/
but fork doesn't port well. The following might work, and I'm pretty
sure it works on both windows and linux/unix:

require 'timeout'

Thread.new do
  begin
    Timeout.timeout(1) do
      `sleep 2` # or system "sleep 2"
      puts "done"
    end
  rescue TimeoutError
    puts "timed out"
  end
end

10.times do
  puts "waiting"
  sleep 0.5
end

__END__

output:

waiting
waiting
waiting
timed out
waiting
waiting
waiting
waiting
waiting
waiting
waiting

···

--
      vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

#3

Thanks for your help!