如何使用Thor(ruby)创建守护进程?

如何使用Thor(ruby)创建守护进程?,ruby,daemons,thor,Ruby,Daemons,Thor,我想使用流行的Thor gem创建一个守护任务。我的雷神课是这样的: require 'rubygems' require 'daemons' require 'thor' class CLI < Thor desc "start", "Startup the App" method_option :daemonize, :aliases => "-d", :default => false, :type => :boolean, :banner => "

我想使用流行的Thor gem创建一个守护任务。我的雷神课是这样的:

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
需要“rubygems”
需要“守护进程”
需要“雷神”
类CLI“-d”,:默认=>false,:type=>:boolean,:banner=>“作为守护进程运行”
def启动
运行应用程序(选项[:daemonize])
结束
描述“停止”,“停止守护进程”
def停止
停止应用程序
结束
无任务{
def run_应用程序(作为_守护程序运行)
#运行应用程序代码
Daemons.daemonize如果作为\u守护程序运行
#循环直到停止或中断
# ...
结束
def停止应用程序
#停止应用程序
结束
}
结束
所以我在这里设置了一个基本的thor类,有两个任务,开始和停止。我目前也在使用守护进程gem,但这不是必需的。我正在努力解决的问题是,当这个应用程序以“run\u thor\u app.rb start”运行时,一切都运行得很好。显然,在这种情况下不需要停止任务。但当我运行“run_thor_app.rb start-d”时,应用程序会一直运行,直到守护进程.daemonize运行,然后退出。检查正在运行的进程表明后台没有运行任何东西

即使有东西在运行,我也不知道如何完成停止任务。例如,如何检测应用程序作为守护进程运行并停止它。我看过守护进程::监视器,但文档中不清楚它是如何工作的,当我尝试它时,它没有工作


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

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

你的代码应该可以工作。我尝试了一个使用
deamons
gem的简单脚本,我试了几次,直到找到了deamonized进程。我想它会得到与父进程相同的名称,或者类似的名称,但是它的名称是“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
并检查pid的
/tmp/mydaemon.pid
文件。然后运行
ps ax | grep x
,其中x是PID。运行
cat/tmp/mydaemon.pid
|xargs kill`杀死守护进程


我认为
守护进程
”gem有一些管理PidFiles的助手,请查看
PidFile
中的
您引导我走上了正确的道路。我已经开始研究守护进程gem中的类,我认为通过直接访问它们,我可以将它们组合在一起。特别是ApplicationGroup和PidFile。我会让你知道事情的进展。你运气好吗?我遇到了一个非常类似的问题,涉及到托尔和守护进程。