From: Tim Uckun Date: 2010-09-22T21:31:35+09:00 Subject: having problems with open4 and stuck forked processes I am running a batch process which uses the wkhtmltoimage-i386 binary to make screenshots of urls. Unfortunately this is in beta and it frequently hangs up and takes up 100% of one of the CPUs on the machine. I have the following code to try and detect the hung process and kill it but it doesn't always work and I was wondering if anybody has a better idea of how to do this. When I run it by testing simple commands like sleep it works perfectly. In production with this binary it doesn't seem to always work. def Util.shell_with_timeout(cmd, seconds = 3600) #the default timeout is an hour. That's probably way too long Timeout::timeout(seconds) { @pid, @stdin, @stdout, @stderr = Open4.popen4(cmd) ignored, @status = Process::waitpid2 @pid if @status.exitstatus != 0 raise "Exit Status not zero" end } @stdout ? @stdout.read.strip : '' rescue Timeout::Error Process.detach @pid Process.kill 'SIGKILL', @pid raise "Process Timed out" rescue => e msg = @stderr ? @stderr.read.strip : '' msg += e.to_s raise "Error during execution of command #{cmd}\n #{msg}" end