rlimit_cpu没有在spawn调用上工作

时间:2013-11-25 21:45:55

标签: ruby linux-kernel ruby-on-rails-4

我正在尝试创建一个执行进程的函数,并在2秒后终止它:

def execute(command, input_file, output_file)
    pid =  Kernel.spawn(command,{
            STDIN => input_file,
            STDOUT => output_file,
            :rlimit_cpu => [2,2], #2 secs,
            :rlimit_nproc => 0,
            :rlimit_as => 16 * 1024 * 1024
            }
      );
    Process.wait(pid)
    puts "exit status = " + $?.exitstatus.to_s
    return File.read(output_file)
end

我使用短时间运行的进程和长时间运行的进程(使用“sleep”调用)测试了此函数。该命令始终完成。我需要使用rlimit_cpu在2秒后使用spawn调用杀死“命令”。我怎么能这样做?

编辑:看起来像rlimit_cpu不能像我想的那样工作。根据{{​​3}}:

  

CPU限制是CPU秒数的限制而不是经过的时间

此外:

  

当您执行fib调用时,您将锤击CPU以使经过的时间和CPU时间关闭(大部分处理时间都花在使用CPU上)。打印时并非如此,因为大部分时间都花在I / O上。

我将使用另一种方法,因为无论进程是CPU绑定还是IO绑定,我都需要终止进程

1 个答案:

答案 0 :(得分:0)

要在两秒钟后终止该过程,请运行一个计时器两秒钟,然后尝试呼叫该孩子的Process.kill