2

私は、労働者の数が毎週増加しているマスターワーカーアーキテクチャを持っています。ワーカーを強制終了し、ソース管理の同期を実行して再起動するために、各マシンにsshまたはリモートコンソールを接続することはもう期待できません。マスターに、各マシンに同期して再起動するように指示するメッセージをネットワーク上に配置してもらいたいです。

それが私が障害にぶつかったところです。正気のプラットフォームを使用している場合は、次のことができます。

exec('ruby', __FILE__)

...そして行われる。ただし、次のテストを行いました。

p Process.pid
sleep 1
exec('ruby', __FILE__)

...そしてWindowsでは、execの呼び出しごとに1つのrubyインスタンスを取得します。問題のウィンドウで^Cを押すまで、それらのどれも死にません。私がこれを試したすべてのプラットフォームで、毎回新しいバージョンのファイルが実行されています。これは、テストが進行している間にテストスクリプトを簡単に編集することで確認しました。

pidを印刷する理由は、表示されている動作を再確認するためです。Windowsでは、実行ごとに異なるpidを取得しています。これは、実行ごとにタスクマネージャーに新しいプロセスが表示されていることを考えると予想されます。Macは正しく動作しています。pidはすべてのシステムコールで同じであり、各実行がexecvesyscallへの呼び出しをトリガーしていることをdtraceで確認しました。

つまり、Windowsのrubyスクリプトに実行を再開させて、実行中に変更されたコード(それ自体を含む)を実行する方法はありますか?これはactiverecordを使用しますが、Railsアプリケーションではないことに注意してください。

4

2 に答える 2

2

いくつかの解決策を試した後 (Byron Whitlock によって提出されたものを含め、最終的には満足のいく結果への道を歩むことができました)、次のように落ち着きました。

IO.popen("start cmd /C ruby.exe #{$0} #{ARGV.join(' ')}")
sleep 5

popen の後でまったく眠らずに終了すると、スポーンが頻繁に (50% 以上の確率で) 失敗することがわかりました。これは明らかにクロスプラットフォームではないため、Mac で同じ動作をさせるには:

IO.popen("xterm -e \"ruby blah blah blah\"&")
于 2010-04-16T21:04:33.377 に答える
0

プログラムを再起動する古典的な方法は、それを実行する別のプログラムを作成することです。したがって、プロセスを生成してからrestart.exe <args>終了するか、終了します。restart.exeは、呼び出し元のスクリプトが実行されなくなるまで待機してから、スクリプトを再開します。

于 2010-04-13T23:25:27.920 に答える