【问题标题】:How can I trigger a shell script and run in background (async) in Ruby?如何在 Ruby 中触发 shell 脚本并在后台(异步)运行?
【发布时间】:2012-08-16 06:50:56
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    @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)
    

    【讨论】:

    • 很好,也可以在 Windows 中使用!尽管有多个进程写入 test.out,但有些行会出现乱码
    • @peter 是的,从多个进程同时对同一个文件进行缓冲写入确实会使某些行出现乱码。这个问题有很多解决方案,但最简单的方法是从每个进程写入一个单独的文件。否则,您可能需要一个单独的进程来复用输出。
    【解决方案2】:

    试试这个:

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

    不适用于可以使用线程的窗口。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2021-10-26
        相关资源
        最近更新 更多