簡體   English   中英

如何使用Thor(ruby)創建守護程序?

[英]How can I create a daemon with Thor (ruby)?

我想使用流行的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

因此,在這里,我設置了一個基本的thor類,其中包含兩個任務,即啟動和停止。 我也正在使用Daemons gem,但這不是必需的。 我苦苦掙扎的部分是,當該應用程序以“ run_thor_app.rb start”運行時,一切運行正常。 顯然,在這種情況下不需要停止任務。 但是,當我運行“ run_thor_app.rb start -d”時,該應用程序將運行,直到Daemons.daemonize運行,然后退出。 檢查正在運行的進程表明后台沒有任何運行。

即使正在運行某些內容,我也不知道如何執行停止任務。 例如,如何檢測該應用程序正在作為守護程序運行並停止它。 我已經看過Daemons :: Monitor了,但是文檔尚不清楚它是如何工作的,當我嘗試它時,它沒有工作。

在我看來,這對於Thor內置的東西來說將是一個很好的用例,但是在github上的代碼中搜索並沒有告訴我任何東西。 也許我只是在某個地方錯過了它。 無論如何,我認為最好與Thor一起記錄最佳做法或處理守護程序的模式,以供其他人參考。

通常,管理守護進程的方法是讓它們將PID寫入文件中。 這使另一個進程可以發現守護程序的PID,並殺死它(或發送其他信號)。

您的代碼應該可以工作。 我嘗試了使用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 ps ax | grep x其中x是PID。 運行cat /tmp/mydaemon.pid | xargs kill`殺死守護程序。

我認為daemons的gem具有一些用於管理PidFile幫助程序,請查看http://rubydoc.info/gems/daemons/1.1.0/frames中的 PidFile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM