我想要运行大约5或6个ruby脚本,就在彼此之后。这些都在我的本地机器(OS X)上,不会在服务器上运行。
每个大约需要15分钟才能运行,我不想在手动运行其他程序之前等待每个人完成。
如果不使用像delayed_job或其他排队宝石一样沉重的东西,我该如何实现?
或者我应该经历设置sidekiq或其他什么的麻烦?
感谢。
P.S。如果其中一个超时(我正在进行网络爬行,因此保持HTTP连接打开有时会给我带来问题),重启脚本会很好 - 偶尔会发生这种情况。
答案 0 :(得分:3)
正如Zabba所说,编写脚本来调用脚本是一个很好的解决方案。您可以为此编写一个简单的Bash脚本,或者使用Ruby,如下所示:
#!/usr/bin/ruby
SCRIPTS=%w{s1.rb s2.rb s3.rb}
MAX_RETRIES=3
SCRIPTS.each do |script|
MAX_RETRIES.times do |n|
system "ruby #{script}"
break if $?.exitstatus == 0
end
end
这使用Ruby中的system
调用,$?
是Process :: Status对象,可用于捕获脚本的退出代码。
为了使其正常工作,您只需要确保脚本在成功时返回exit
的退出代码(使用0
命令),或者非零,例如1
失败。
运行system
时存在一些明显的安全问题,因此,除非您在本地计算机上,否则请相应地设置权限:)
答案 1 :(得分:1)
假设您的ruby脚本在发生故障时返回非零错误代码,您的bash脚本可能就像下面这样简单:
#!/bin/bash
ruby script1.rb
if [[ $? -ne 0 ]]; then
... handle script1 errors here ...
fi
ruby script2.rb
if [[ $? -ne 0 ]]; then
... handle script2 errors here ...
fi
... etc, etc ...
答案 2 :(得分:0)
只需从终端一行执行所有操作。这几乎可以肯定是最轻的解决方案。
ruby script0.rb; ruby script1.rb; ruby script2.rb; ruby script3.rb
如果脚本超时,则不会重新启动脚本,但您可能应该在脚本本身处理它...