0

program.rb という名前のスクリプトがあり、次のことを行う main.rb という名前のスクリプトを作成したいと考えています。

system("ruby", "program.rb")

constantly check if program.rb is running until it is done
if program.rb has reached completion
    exit main.rb
end
otherwise keep doing this until program.rb reaches completion{
if program.rb is not running and stopped before completing
    restart program.rb from where it left off
end}

私はPidifyを調べましたが、これを正確に正しい方法で適用する方法を見つけることができませんでした...このスクリプトにアプローチする方法についての助けがあれば大歓迎です!

更新: main.rb でそれを行う方法がない場合、program.rb で中断したところからスクリプトの実行を再開する方法を理解できました。

4

2 に答える 2

1

からの全面的な協力なしに「中断したところからスクリプトを再開する」ことは不可能program.rbです。つまり、進行状況をアドバタイズでき(現在の状態をファイルに書き込むことで)、ARGVで指定されたステップから正しく開始できる必要があります。この機能を置き換えることができる外部のルビーの魔法はありません。

また、プログラムが異常終了した場合は、次の2つのいずれかを意味します。

  • エラーは(半)永続的です(ディスクがいっぱいである、ファイルへの適切なアクセス権がないなど)。この場合、プログラムを再起動するだけで、プログラムは再び失敗します。そしてまた。無限の失敗ループ。
  • エラーは一時的なものです(インターネット接続が不安定です)。この場合、プログラムは例外処理でより良い仕事をし、(終了するのではなく)それ自体で再試行する必要があります。

どちらの場合も、再起動する必要はありません、IMHO。

于 2013-03-19T17:51:28.437 に答える
1

さて、ここに1つの方法があります。

program.rbオプションのフラグ引数--restartか何かを取るように変更します。

このprogram.rb引数なしで起動すると、現在の状態を記録するためにファイルが初期化されます。定期的に、何らかのチェックポイントを記録するために必要なものをこのファイルに書き込みます。

program.rb再起動フラグで起動する、チェックポイント ファイルを読み取り、その時点で処理を開始します。これが機能するためには、すべての状態変化をチェックポイントするか、チェックポイント間のすべての処理が冪等になるように調整して、悪影響を与えずに繰り返すことができるようにする必要があります。

の状態を監視する方法はたくさんありますprogram.rb。最良の方法は、何らかの ping を使用することです。おそらくGET /health_check、ソケットまたはパイプを介したダミー メッセージのようなものです。ロックがまだ保持されているかどうかを検出するためにロックされたファイルを保持することも、起動時に PID を記録して、それがまだ存在することを確認することもできます。

于 2013-03-19T18:00:20.683 に答える