如何在Ruby中触发shell脚本并在后台(异步)中运行?

时间:2012-08-16 06:50:57

标签: ruby

我有一个名为test.sh的shell脚本。如何从Ruby触发test.sh?

我希望test.sh作为后台进程运行,这意味着在Ruby中它是一个ansync调用。

还需要将STDERR和STDOUT写入特定文件。

有什么想法吗?

3 个答案:

答案 0 :(得分:25)

@ TanzeebKhalili的答案有效,但您可以考虑Kernel.spawn(),它不会等待该过程返回:

pid = spawn("./test.sh")
Process.detach(pid)

请注意,根据文档,无论您使用spawn()还是手动fork()system(),都应该获取PID Process.detach()或{{1}在退出之前。

关于重定向标准错误和输出,使用Process.wait()

很容易
spawn()

答案 1 :(得分:9)

试试这个:

Process.fork { system "./test.sh" }

无法在Windows上使用,您可以使用线程。

答案 2 :(得分:0)

我认为IO.popopen在这里也值得一提。诸如此类的东西会附加多次运行命令的输出。到stdout.logstderr.log

open('stdout.log', 'a') { |file|
  file.puts(
      IO.popen(["./test.sh"], :err => ["stderr.log", "a"]) { |result| 
          result.read 
      }
  )
end