Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从ruby同时运行ruby脚本?_Ruby_Scripting_Command_System - Fatal编程技术网

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

如何从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完成等情况下执行上述操作?我想它可能必须为

我有一个名为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完成等情况下执行上述操作?我想它可能必须为每个程序打开一个新的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?