等待Ruby子进程退出的PID

8
我正在尝试分叉一个子进程,等待它完成,如果在一定时间内没有完成,就杀死它。
以下是我目前的代码:
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

在进程的Process.wait后面或周围,我希望有一种实用工具来等待20秒钟,如果该进程仍然存在,我希望将其终止并将输出标记为“ERROR”。

我刚接触fork/exec。我的代码实际上可以进行分叉,但我不知道如何处理等待/杀死方面的问题。

2个回答

11

使用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

0

subexec一个机会。来自README:

Subexec是一个简单的库,它可以生成一个带有可选超时参数的外部命令。它依赖于Ruby 1.9的Process.spawn方法。同时,它适用于同步和异步代码。

对于那些用于CLI的Ruby封装库非常有用。例如,使用ImageMagick的mogrify命令调整图像大小有时会停滞不前,永远无法将控制权返回给原始进程。这就是Subexec的用武之地。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接