Как запустить несколько внешних команд в фоновом режиме в ruby - PullRequest
3 голосов
/ 14 января 2011

С учетом этого сценария оболочки Unix:

test.sh:

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

time ./test.sh

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

Как бы вы сделали то же самоев Ruby на Unix-машине?

Команды сна являются лишь примером, просто предположим, что они вместо этого долго выполняют внешние команды.

Ответы [ 3 ]

5 голосов
/ 14 января 2011

Прямо из Process#waitall документация:

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

Конечно, вместо использования sleep в Ruby, вы можете вызывать любую внешнюю команду, используя Kernel#system или оператор обратного хода .

1 голос
/ 14 января 2011
#!/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) }
0 голосов
/ 14 января 2011

Чтобы ответить на мой собственный вопрос (только что узнал об этом):

​#!/usr/bin/ruby

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

Process.waitall

На ruby ​​1.8 вам нужно установить гем sfl, а также требовать:

require 'rubygems'
require 'sfl'
...