0

次々に実行したい Ruby スクリプトが 5 つまたは 6 つある。これらはすべてローカル マシン (OS X) 上にあり、サーバー上では実行されません。

それぞれの実行には約 15 分かかりますが、他の実行を手動で実行する前に、それぞれが終了するのを待つ必要はありません。

delayed_job やその他のキューイング gem のような重いものを使用せずに、どうすればこれを達成できますか?

それとも、sidekiq などを設定する手間をかけるべきでしょうか?

ありがとう。

PSスクリプトの1つがタイムアウトした場合は、スクリプトを再起動すると便利です(Webクロールを行っているため、HTTP接続を開いたままにしておくと問題が発生することがあります)-これは時々発生します。

4

3 に答える 3

3

ザバが言ったように、スクリプトを呼び出すスクリプトを書くことは良い解決策です。このために簡単な 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

端末からすべてを 1 行で実行するだけです。これはほぼ確実に最も軽量なソリューションです。

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

タイムアウトした場合、これはスクリプトを再起動しませんが、おそらくスクリプト自体でそれを処理する必要があります...

于 2013-02-08T23:45:52.940 に答える