2

人気のある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でデーモンを処理するためのベストプラクティスまたはパターンを文書化するとよいと思います。

4

1 に答える 1

1

通常、デーモンプロセスを管理する方法は、デーモンプロセスにPIDをファイルに書き込ませることです。これにより、別のプロセスがデーモンのPIDを検出し、それを強制終了する(または他のシグナルを送信する)ことが可能になります。

コードは機能するはずです。gemを使用したベアボーンスクリプトを試しdeamonsましたが、デーモン化されたプロセスが見つかるまで数回試行しました。親プロセスと同じ名前かそれに似た名前になると思いましたが、代わりに「self」という名前でした。デーモン化されたプロセスは、に書き込みを行わなくなることに注意してくださいSTDOUT

とにかく、これを試してください:

# set up everything
# then daemonize
Daemons.daemonize
# and write a pid file
File.open('/tmp/mydaemon.pid', 'w') { |f| f.puts(Process.pid) }
loop do
  # do something
  # this loop is important, if the script ends the daemon dies
end

/tmp/mydaemon.pidファイルでPIDを確認します。次にps ax | grep x、xがPIDである場合に実行します。実行cat /tmp/mydaemon.pid| xargs kill`は、デーモンを強制終了します。

daemons'gemにはPidFilesを管理するためのヘルパーがいくつかあると思います。http ://rubydoc.info/gems/daemons/1.1.0/framesPidFileで確認してください。

于 2011-01-11T16:57:09.310 に答える