控制Rails中系统进程的超时

时间:2013-10-23 19:31:38

标签: ruby-on-rails kill system-calls

我正在从我的控制器启动casperJS脚本:

output = `casperjs #{path_to_file} '#{url}#'`

有时,由于多种原因,casperjs脚本可能会挂起,或者可能需要很长时间。我想知道无论如何我都可以在我的控制器中设置超时来杀死进程并控制它。这可能吗?

1 个答案:

答案 0 :(得分:1)

require 'timeout'
Timeout.timeout(<seconds>) do
   output = `casperjs #{path_to_file} '#{url}#'`
end

如果脚本未在给定时间内完成,则会引发Timeout :: Error异常

编辑(在超时后终止进程)

require 'timeout'
pipe_cmd_in, pipe_cmd_out = IO.pipe
pid = Process.spawn("casperjs #{path_to_file} '#{url}#'", :out => pipe_cmd_out, :err => pipe_cmd_out)
Timeout.timeout(<seconds>) do
   Process.wait(pid)
   pipe_cmd_out.close
   output = pipe_cmd_in.read;
end
rescue Timeout::Error
   Process.kill('TERM', pid)
end

同时查看teminator gem。如果您有许多系统调用来处理

,这将有所帮助