人気のあるThorgemを使用して、デーモン化されたタスクを作成したいと思います。私のThorクラスは次のようになります。
require 'rubygems'
require 'daemons'
require 'thor'
class CLI < Thor
desc "start", "Startup the App"
method_option :daemonize, :aliases => "-d", :default => false, :type => :boolean, :banner => "Run as daemon"
def start
run_app(options[:daemonize])
end
desc "stop", "Stop the daemon"
def stop
stop_app
end
no_tasks {
def run_app(run_as_daemon)
# Run the application code
Daemons.daemonize if run_as_daemon
# loop until stopped or interrupted
# ...
end
def stop_app
#stop the app
end
}
end
そこで、ここでは、開始と停止の2つのタスクを持つ基本的なトールクラスを設定しました。私も現在Daemonsgemを使用していますが、これは必須ではありません。私が苦労しているのは、このアプリが「run_thor_app.rb start」として実行されると、すべてが正常に実行されることです。明らかに、この場合、停止タスクは必要ありません。しかし、「run_thor_app.rb start -d」を実行すると、Daemons.daemonizeが実行されるまでアプリが実行され、その後終了します。実行中のプロセスを確認すると、バックグラウンドで何も実行されていないことがわかります。
何かが実行されていても、停止タスクにアプローチする方法がわかりません。たとえば、アプリがデーモンとして実行されていることをどのように検出して停止しますか。Daemons :: Monitorを見てきましたが、それがどのように機能するかについてのドキュメントが明確ではなく、試してみたところ、機能しませんでした。
これはThorに組み込まれているものの良いユースケースのように思えますが、githubでコードを検索しても、何もわかりません。多分私はどこかでそれを逃した。いずれにせよ、他の人が参照できるように、Thorでデーモンを処理するためのベストプラクティスまたはパターンを文書化するとよいと思います。