我想使用流行的 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 处理守护进程的最佳实践或模式以供其他人参考。