你如何同时从ruby运行ruby脚本?

时间:2013-03-22 19:50:05

标签: ruby scripting command system

我有一个名为main.rb的程序,我想执行以下操作:

system("ruby", "program1.rb")
sleep 60
system("ruby", "program2.rb")
sleep 60
system("ruby", "program3.rb")
sleep 60
system("ruby", "program4.rb")

puts "Programs are done running"

有没有办法在没有program2等到program1完成之后再执行上述操作?我认为可能需要为每个程序打开一个新的CLI? 另外,我想输出"程序运行完毕"只有当所有4个完成时才会显示消息有没有办法做到这一点? 谢谢!

4 个答案:

答案 0 :(得分:6)

您似乎希望每个程序同时运行,但希望在启动每个子程序之间等待60秒,然后等待所有程序完成。 Process::spawn基本上是system,但背景是子进程返回其pid。这应该可以满足您的需求:

to_run = %w{program1.rb program2.rb program3.rb program4.rb}
pids = [ Process.spawn('ruby', to_run.first) ]
pids.concat to_run.drop(1).map{ |p| sleep(60); Process.spawn('ruby', p) }
Process.waitall
puts 'Everything done!'

如果其他地方产生了其他子进程,waitall将等待所有这些进程。要仅等待您在此处生成的设置,请将上面的Process.waitall替换为wait上的循环

pids.delete(wait) until pids.empty?

答案 1 :(得分:4)

您可以使用Thread类。特别是.new和#join。 (http://www.ruby-doc.org/core-2.0/Thread.html

示例:

runner.rb

threads = [1, 2, 3, 4].map do |time|
  Thread.new { system("ruby sleep.rb #{time}") }
end

threads.map(&:join)

puts "Everything done!"

sleep.rb

sleep ARGV[0].to_i

输出

> time ruby runner.rb
Everything done!
ruby runner.rb  0.24s user 0.05s system 7% cpu 4.125 total

答案 2 :(得分:1)

我想你想要Process.spawn。如果您在产生终止状态后想要了解终止状态,请使用Process.waitHere's the relevant documentation; probably worth a read to figure out exactly what you want to do.

答案 3 :(得分:1)

如果您希望在Ruby中并行运行进程,则需要调查线程,或者比使用system更复杂的事情。

你没有说你正在运行什么操作系统,但为什么不用shell脚本呢?它内置且非常简单:

#!/bin/sh

ruby program1.rb &
sleep 60
ruby program2.rb &
sleep 60
ruby program3.rb &
sleep 60
ruby program4.rb &

&将命令放入Linux和Mac OS的后台,因此脚本将立即重新获得控制权并休眠60秒。

说“程序已经完成运行”是没有意义的,除非你等待所有这些程序完成,这需要更多的工作。