[英]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.