如何从ruby同时运行ruby脚本?
我有一个名为main.rb的程序,我想执行以下操作:如何从ruby同时运行ruby脚本?,ruby,scripting,command,system,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" 有没有一种方法可以在不让程序2等待程序1完成等情况下执行上述操作?我想它可能必须为
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"
有没有一种方法可以在不让程序2等待程序1完成等情况下执行上述操作?我想它可能必须为每个程序打开一个新的CLI?
另外,我希望仅当所有4个都完成时才输出“程序已完成运行”消息。有办法吗?
谢谢大家! 您可以为此使用
线程类。具体来说,新建和加入。()
例如:
runner.rb
sleep.rb
输出
我想您需要进程。生成。如果在生成终止状态后需要有关终止状态的信息,请使用Process.wait
如果你想让进程在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秒
除非您正在等待所有程序完成,否则说“程序已完成运行”是没有意义的,这需要更多的工作。似乎您希望每个程序同时运行,但希望在启动每个子程序之间等待60秒,然后等待所有程序完成。本质上是系统
,但子流程返回其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!'
如果在其他地方生成了其他子进程,则将等待所有子进程。要仅等待在此处生成的集合,请将上面的Process.waitall
替换为循环
我在Windows7上。我需要等待它们全部完成,因为它们都将结果输出到一个文件中,然后通过电子邮件发送给我自己。如果您正在写入一个文件,并且需要按作业顺序和分组输出,那么您将不得不执行多线程、并行或后台运行。独立运行的作业可以在不同的时间输出。如果它们都试图写入同一个文件,那么输出将在所有作业之间交织。相反,您可以让他们写入自己的输出文件,然后按照您期望的顺序将它们连接到一个文件中,然后发送。谢谢!但是我得到了以下错误:“spawn”:Exec格式错误-program1.rb(Errno::ENOEXEC)@walterfaye显然您的ruby程序没有标记为可执行程序。将spawn(foo)
命令更改为spawn('ruby',foo)
,或使您的ruby程序可执行。虽然这是可行的,但根据对各种答案的评论,这需要很多帮助才能让您走上正确的道路,从而能够做您想做的事情。您需要了解线程、同步线程的输出,或者单独捕获它们的输出,然后将其重新组合为单个消息。这超出了关于堆栈溢出的单个问题的范围。
> time ruby runner.rb
Everything done!
ruby runner.rb 0.24s user 0.05s system 7% cpu 4.125 total
#!/bin/sh
ruby program1.rb &
sleep 60
ruby program2.rb &
sleep 60
ruby program3.rb &
sleep 60
ruby program4.rb &
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!'
pids.delete(wait) until pids.empty?