ruby - Rubyアプリケーションをソフトリスタートする方法は?

原文 ruby capistrano

単純なルビーアプリケーション(Webアプリケーションではないため、レールやシナトラなどの既存のプラットフォームを使用しない)でデータを継続的に処理しています。

Capistranoでデプロイし、rubyコマンドで起動する予定です。問題は、バッチでデータを取得することです。データの処理には数分かかる場合があります。

新しいバージョンをデプロイするときに、ソフトリスタートを導入したいと思います。つまり、アプリは最初に新しいデプロイについて通知されます。つまり、バッチを完了してから、「更新の準備ができています」(デプロイスクリプト)と言います。そのメッセージを待ちます)。

そのための宝石はありますか?たぶん、カピストラーノにはそのオプションが含まれていますか?
答え
アプリケーションがPOSIXシグナルをトラップできるようにします。 Signal classを見てください。

kill <signal type>をプロセスに送信すると、プロセスが現在何をしているかに関係なく、シグナルハンドラーが呼び出されます。たとえば、ロジックの適切なポイント(たとえば、実行ループの最後)でチェックされるある種のフラグを設定し、そのフラグが設定されている場合はプロセスを終了することができます。応答できるmany signalsはありますが、SIGHUPまたはSIGUSR信号の1つは、おそらくあなたがしていることに意味があります...好きな信号に好きな方法で応答できますが、通常処理されるほとんどの動作(SIGTERMSIGKILLなど)のデフォルトの動作を許可することは理にかなっています。本当に複雑なものについては、コード化された一連の信号を実際に受け入れて、特定のイベントをトリガーすることもできます。

Signal.trap("HUP") do
  puts "Huh?"
end

loop do
  puts "Looping..."
  sleep 2
end


出力

[chris@chipbook:~%] ruby sig_demo.rb 
Looping...
Looping...
Looping...
Looping...
Looping...
Huh?
Looping...
Looping...
Looping...
Huh?
Looping...
Looping...
Looping...


別のターミナルウィンドウで私がやったので:

[chris@chipbook:/usr/local%] ps aux | grep ruby
chris          69487   0.0  0.0  2425480    188 s005  R+   11:26pm   0:00.00 grep ruby
chris          69462   0.0  0.1  2440224   4060 s004  S+   11:26pm   0:00.03 ruby sig_demo.rb
[chris@chipbook:/usr/local%] kill -HUP 69462
[chris@chipbook:/usr/local%] kill -HUP 69462
関連記事

ruby - Ruby gemのインストールディレクトリが間違っている

ruby - 画面キャプチャ用のRails gem

ruby - ルビーのobjects .eachメソッドでは、objectから値を読み取ることができますが、それに値を書き込むことはできません。スコーピングの問題?

ruby-on-rails - Rails-(レコードのIDを使用する)フィールド値をコールバック経由で保存するにはどうすればよいですか?

ruby-on-rails - グローバルRails管理アプリ:実行時に動的にデータベース設定を読み込み、いくつかのアプリに接続してタスクを管理しますか?

ruby - Ruby XMLRPCを使用した開発者キーによるUPCデータベースルックアップ

ruby-on-rails - system.namespacesコレクションに対するMongoDB冗長クエリ?

ruby-on-rails - ユーザーの配列が写真の配列を表示できるようにするにはどうすればよいですか

html - HTMLからRuby関数にパラメーターを渡す

ruby - Padrinoフォームヘルパーとformbuilderの使用-はじめに