16

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

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

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

有任何想法吗?

4

3 回答 3

35

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

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

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

关于重定向标准错误和输出,这很容易spawn()

pid = spawn("./test.sh", :out => "test.out", :err => "test.err")
Process.detach(pid)
于 2012-08-16T08:47:31.627 回答
13

试试这个:

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

不适用于 Windows,您可以使用线程。

于 2012-08-16T07:43:44.340 回答
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
于 2019-10-26T19:18:54.560 回答