【发布时间】:2013-01-17 09:22:36
【问题描述】:
我正在尝试通过以下命令从 Ruby 运行一些计算密集型程序:
%x(heavy_program)
但是,我有时想限制程序的运行时间。所以我试着做
%x(ulimit -St #{max_time} & heavy_program)
但它似乎失败了;即使我在 Ruby 外部运行的 sh shell 中尝试“&”技巧,它也不起作用。
我确信有更好的方法来做到这一点......
【问题讨论】:
我正在尝试通过以下命令从 Ruby 运行一些计算密集型程序:
%x(heavy_program)
但是,我有时想限制程序的运行时间。所以我试着做
%x(ulimit -St #{max_time} & heavy_program)
但它似乎失败了;即使我在 Ruby 外部运行的 sh shell 中尝试“&”技巧,它也不起作用。
我确信有更好的方法来做到这一点......
【问题讨论】:
使用&& 或;:
%x(ulimit -St #{max_time} && heavy_program)
%x(ulimit -St #{max_time}; heavy_program)
但是使用ulimit 可能不是您真正需要的,请考虑以下代码:
require 'timeout'
Timeout(max_time){ %x'heavy_program' }
ulimit 限制 CPU 时间,timeout 限制总运行时间,因为我们人类通常会计算它。
因此,例如,如果您使用 ulimit -St 5 运行 sleep 999999 shell 命令 - 它不会运行 5 秒,而是运行所有 999999,因为 sleep 使用的 CPU 时间 可以忽略不计
【讨论】:
& 表示在后台运行指定的任务,它不太可能在 ruby 的 %x 上运行; cmdA && cmdB 表示“仅在 cmdA 成功时运行 cmdB”; cmdA; cmdB 表示“先运行 cmdA,再运行 cmdB”