我有大约 5 或 6 个我想运行的 ruby 脚本,一个接一个。这些都在我的本地机器(OS X)上,不会在服务器上运行。
每个都需要大约 15 分钟才能运行,我不想在手动运行其他之前等待每个完成。
如果不使用像 delay_job 或其他一些排队 gem 这样重的东西,我怎么能做到这一点?
或者我应该经历设置sidekiq或其他东西的麻烦吗?
谢谢。
PS 如果其中一个超时(我正在进行网络爬网,因此保持 HTTP 连接打开有时会给我带来问题),重新启动脚本会很好 - 这种情况偶尔会发生。
我有大约 5 或 6 个我想运行的 ruby 脚本,一个接一个。这些都在我的本地机器(OS X)上,不会在服务器上运行。
每个都需要大约 15 分钟才能运行,我不想在手动运行其他之前等待每个完成。
如果不使用像 delay_job 或其他一些排队 gem 这样重的东西,我怎么能做到这一点?
或者我应该经历设置sidekiq或其他东西的麻烦吗?
谢谢。
PS 如果其中一个超时(我正在进行网络爬网,因此保持 HTTP 连接打开有时会给我带来问题),重新启动脚本会很好 - 这种情况偶尔会发生。
正如 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,因此除非您在本地计算机上,否则请相应地设置您的权限:)
假设您的 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 ...
只需在一行上从终端执行它们。这几乎可以肯定是最轻的解决方案。
ruby script0.rb; ruby script1.rb; ruby script2.rb; ruby script3.rb
如果超时,这不会重新启动脚本,但您可能应该在脚本本身中处理它......