等待Ruby子pid退出

awo*_*ojo 7 ruby fork

我正在尝试分叉一个子进程,等待它完成,如果它在一定时间内没有完成,就把它杀掉.

这是我到目前为止:

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
Run Code Online (Sandbox Code Playgroud)

在Process.wait之后的某个地方,我希望某种实用程序等待20秒,如果进程仍然在那里,我想杀死它并将输出标记为"ERROR".

我是fork/exec的新手.我的代码实际上是分叉的,但我只是不知道如何处理它的等待/查杀方面.

nne*_*neo 10

使用Timeout模块 :(来自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
Run Code Online (Sandbox Code Playgroud)