Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中触发shell脚本并在后台(异步)运行?_Ruby - Fatal编程技术网

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

如何在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")

我有一个名为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.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