【问题标题】:How can I create a daemon with Thor (ruby)?如何使用 Thor (ruby) 创建守护进程?
【发布时间】:2011-06-07 05:55:44
【问题描述】:

我想使用流行的 Thor gem 来创建一个守护进程。我的 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

所以在这里我设置了一个基本的雷神类,它有两个任务,启动和停止。我目前也在使用 Daemons gem,但这不是必需的。我正在苦苦挣扎的部分是,当这个应用程序作为“run_thor_app.rb start”运行时,一切都运行得很好。显然,在这种情况下不需要停止任务。但是当我运行“run_thor_app.rb start -d”时,应用程序会一直运行,直到 Daemons.daemonize 运行然后退出。检查正在运行的进程表明后台没有运行任何东西。

即使某些东西正在运行,我也不知道如何处理停止任务。例如,您如何检测应用程序作为守护程序运行并停止它。我查看了 Daemons::Monitor,但文档并不清楚它是如何工作的,当我尝试它时,它不起作用。

在我看来,这对于 Thor 内置的东西来说是一个很好的用例,但在 github 上搜索代码并没有向我透露任何信息。也许我只是在某个地方错过了它。无论如何,我认为最好记录下使用 Thor 处理守护进程的最佳实践或模式以供其他人参考。

【问题讨论】:

    标签: ruby daemons thor


    【解决方案1】:

    您通常管理守护进程的方式是将它们的 PID 写入文件中。这使得另一个进程可以发现守护进程的 PID,并杀死它(或发送一些其他信号)。

    您的代码应该可以工作。我尝试了一个使用deamons gem 的简单脚本,我尝试了几次,直到找到了去魔化进程。我想它会得到与父进程相同的名称,或类似的名称,但它的名称是“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 的助手,请查看PidFile in http://rubydoc.info/gems/daemons/1.1.0/frames

    【讨论】:

    • 你带领我走上了正确的道路。我已经开始查看 Daemons gem 中的类,我认为我可以通过直接访问它们来将某些东西组合在一起。特别是 ApplicationGroup 和 PidFile。我会告诉你进展如何。
    • 你运气好吗?我在解决涉及雷神和守护进程的非常相似的问题时遇到了困难。
    猜你喜欢
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多