gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:38:01 24 4
gpt4 key购买 nike

我想使用流行的 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

所以我在这里设置了一个基本的 thor 类,其中包含两个任务,开始和停止。我目前也在使用 Daemons gem,但这不是必需的。我正在努力解决的部分是,当此应用程序以“run_thor_app.rb start”运行时,一切都运行良好。显然,在这种情况下不需要停止任务。但是当我运行“run_thor_app.rb start -d”时,该应用程序一直运行到 Daemons.daemonize 运行然后退出。检查正在运行的进程表明没有任何东西在后台运行。

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

在我看来,这对于 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

并检查 /tmp/mydaemon.pid 文件中的 PID。然后运行 ​​ps ax | grep x 其中 x 是 PID。运行 cat/tmp/mydaemon.pid | xargs kill` 杀死守护进程。

我认为 daemons' gem 有一些管理 PidFiles 的助手,查看 http://rubydoc.info/gems/daemons/1.1.0/frames 中的 PidFile

关于ruby - 如何使用 Thor (ruby) 创建守护进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4659164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com