繁体   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