0

我有大约 5 或 6 个我想运行的 ruby​​ 脚本,一个接一个。这些都在我的本地机器(OS X)上,不会在服务器上运行。

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

如果不使用像 delay_job 或其他一些排队 gem 这样重的东西,我怎么能做到这一点?

或者我应该经历设置sidekiq或其他东西的麻烦吗?

谢谢。

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

4

3 回答 3

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

这使用systemRuby 中的调用,并且$?是 Process::Status 对象,您可以使用它来捕获脚本的退出代码。

为了使其正常工作,您只需要确保您的脚本在成功时返回退出代码(使用exit命令) ,或者在失败时返回0非零值。1

存在一些明显的安全问题system,因此除非您在本地计算机上,否则请相应地设置您的权限:)

于 2012-12-05T22:39:27.790 回答
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 ...
于 2012-12-05T23:01:26.960 回答
0

只需在一行上从终端执行它们。这几乎可以肯定是最轻的解决方案。

ruby script0.rb; ruby script1.rb; ruby script2.rb; ruby script3.rb

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

于 2013-02-08T23:45:52.940 回答