【问题标题】:How to run multiple external commands in the background in ruby如何在ruby的后台运行多个外部命令
【发布时间】:2026-02-17 18:35:02
【问题描述】:

鉴于这个 Unix shell 脚本:

test.sh:

#!/bin/sh
sleep 2 &
sleep 5 &
sleep 1 &
wait

时间./test.sh

real 0m5.008s
user 0m0.040s
sys  0m0.000s

你将如何在 Unix 机器上用 Ruby 完成同样的事情?

sleep 命令只是一个例子,假设它们是长时间运行的外部命令。

【问题讨论】:

    标签: ruby shell unix process multitasking


    【解决方案1】:

    直接来自Process#waitall 文档:

    fork { sleep 0.2; exit 2 }   #=> 27432
    fork { sleep 0.1; exit 1 }   #=> 27433
    fork {            exit 0 }   #=> 27434
    p Process.waitall
    

    当然,您可以使用Kernel#systembacktick operator 调用任何外部命令,而不是使用Ruby 的sleep

    【讨论】:

      【解决方案2】:
      #!/usr/bin/env ruby
      pids = []
      pids << Kernel.fork { `sleep 2` }
      pids << Kernel.fork { `sleep 5` }
      pids << Kernel.fork { `sleep 1` }
      pids.each { |pid| Process.wait(pid) }
      

      【讨论】:

        【解决方案3】:

        回答我自己的问题(刚刚发现):

        ​#!/usr/bin/ruby
        
        spawn 'sleep 2'
        spawn 'sleep 5'
        spawn 'sleep 1'
        
        Process.waitall
        

        在 ruby​​ 1.8 上,您需要安装 sfl gem 并且还需要这个:

        require 'rubygems'
        require 'sfl'
        

        【讨论】:

          最近更新 更多