如何在Ruby中触发shell脚本并在后台(异步)运行?
我有一个名为test.sh的shell脚本。如何从Ruby触发test.sh 我希望test.sh作为后台进程运行,这在Ruby中意味着它是一个ansync调用 还需要将STDERR和STDOUT写入特定文件 有什么想法吗?试试这个:如何在Ruby中触发shell脚本并在后台(异步)运行?,ruby,Ruby,我有一个名为test.sh的shell脚本。如何从Ruby触发test.sh 我希望test.sh作为后台进程运行,这在Ruby中意味着它是一个ansync调用 还需要将STDERR和STDOUT写入特定文件 有什么想法吗?试试这个: Process.fork { system "./test.sh" } 不会在Windows上工作,你可以使用线程。 < P> @ TanzeebKhalili的答案是有效的,但是你可以考虑,这不等待进程返回: pid = spawn("./test.sh")
Process.fork { system "./test.sh" }
不会在Windows上工作,你可以使用线程。
< P> @ TanzeebKhalili的答案是有效的,但是你可以考虑,这不等待进程返回:pid = spawn("./test.sh")
Process.detach(pid)
请注意,根据文档,无论您使用spawn()
还是手动使用fork()
和system()
,在退出之前,您都应该抓取PID和Process.detach()
或Process.wait()
关于重定向标准错误和输出,使用spawn()
很容易:
我认为,
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
很好,也适用于windows!使用多个写入test.out的进程时,某些行会出现混乱though@peter是的,从多个进程同时对同一个文件进行缓冲写操作确实会弄乱一些行。这个问题有很多解决方案,但最简单的方法就是从每个进程中写入一个单独的文件。否则,您可能需要一个单独的进程来多路传输输出。
open('stdout.log', 'a') { |file|
file.puts(
IO.popen(["./test.sh"], :err => ["stderr.log", "a"]) { |result|
result.read
}
)
end