【发布时间】:2012-08-16 06:50:56
【问题描述】:
我有一个名为 test.sh 的 shell 脚本。如何从 Ruby 触发 test.sh?
我希望 test.sh 作为后台进程运行,这在 Ruby 中意味着它是一个异步调用。
STDERR 和 STDOUT 也需要写入特定文件。
有什么想法吗?
【问题讨论】:
标签: ruby
我有一个名为 test.sh 的 shell 脚本。如何从 Ruby 触发 test.sh?
我希望 test.sh 作为后台进程运行,这在 Ruby 中意味着它是一个异步调用。
STDERR 和 STDOUT 也需要写入特定文件。
有什么想法吗?
【问题讨论】:
标签: ruby
@TanzeebKhalili 的回答有效,但您可以考虑Kernel.spawn(),它不会等待进程返回:
pid = spawn("./test.sh")
Process.detach(pid)
请注意,根据文档,无论您使用spawn() 还是手动使用fork() 和system(),您都应该在退出之前获取PID 和Process.detach() 或Process.wait()。
关于重定向标准错误和输出,spawn() 很容易:
pid = spawn("./test.sh", :out => "test.out", :err => "test.err")
Process.detach(pid)
【讨论】:
试试这个:
Process.fork { system "./test.sh" }
不适用于可以使用线程的窗口。
【讨论】:
我认为IO.popopen 在这里也值得一提。像这样的东西会附加命令多次运行的输出。给stdout.log和stderr.log
open('stdout.log', 'a') { |file|
file.puts(
IO.popen(["./test.sh"], :err => ["stderr.log", "a"]) { |result|
result.read
}
)
end
【讨论】: