如何在ruby中在后台运行多个外部命令

时间:2011-01-14 09:25:04

标签: ruby shell unix process multitasking

鉴于这个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完成同样的事情?

睡眠命令只是一个例子,只是假设他们长时间运行外部命令。

3 个答案:

答案 0 :(得分:5)

直接来自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

答案 1 :(得分:1)

#!/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) }

答案 2 :(得分:0)

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

​#!/usr/bin/ruby

spawn 'sleep 2'
spawn 'sleep 5'
spawn 'sleep 1'

Process.waitall

在ruby 1.8上你需要安装sfl gem并且还要求:

require 'rubygems'
require 'sfl'