如何在本地计算机上按顺序运行多个ruby脚本?

时间:2012-12-05 22:05:52

标签: ruby delayed-job

我想要运行大约5或6个ruby脚本,就在彼此之后。这些都在我的本地机器(OS X)上,不会在服务器上运行。

每个大约需要15分钟才能运行,我不想在手动运行其他程序之前等待每个人完成。

如果不使用像delayed_job或其他排队宝石一样沉重的东西,我该如何实现?

或者我应该经历设置sidekiq或其他什么的麻烦?

感谢。

P.S。如果其中一个超时(我正在进行网络爬行,因此保持HTTP连接打开有时会给我带来问题),重启脚本会很好 - 偶尔会发生这种情况。

3 个答案:

答案 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

如果脚本超时,则不会重新启动脚本,但您可能应该在脚本本身处理它...