Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Waiting for Ruby child pid to exit

Tags:

fork

ruby

I'm trying to fork a sub-process, wait for it to finish, if it doesn't finish within a certain amount of time, kill it.

This is what I have so far:

servers.each do |server|
    pid = fork do
        puts "Forking #{server}."
        output = "doing stuff here"
        puts output
    end

    Process.wait
    puts "#{server} child exited, pid = #{pid}"
end

Somewhere after/around Process.wait, I would like some sort of utility to wait 20 seconds, and if the process is still out there, I'd like to kill it and mark output as "ERROR."

I'm new to fork/exec. My code actually forking works, but I just don't know how to approach the waiting / killing aspect of it.

like image 448
awojo Avatar asked Sep 24 '12 20:09

awojo


1 Answers

Use the Timeout module: (code from http://www.whatastruggle.com/timeout-a-subprocess-in-ruby)

require 'timeout'

servers.each do |server|
    pid = fork do
        puts "Forking #{server}."
        output = "doing stuff here"
        puts output
    end

    begin
        Timeout.timeout(20) do
            Process.wait
        end
    rescue Timeout::Error
        Process.kill 9, pid
        # collect status so it doesn't stick around as zombie process
        Process.wait pid
    end
    puts "#{server} child exited, pid = #{pid}"
end
like image 135
nneonneo Avatar answered Oct 11 '22 04:10

nneonneo