gpt4 book ai didi

ruby - 为什么 Ruby 服务器仅在守护进程时才会产生僵尸?

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:23 24 4
gpt4 key购买 nike

tl;dr: rackup -p 1234 <= 有效。 rackup -p 1234 -D <= 创建僵尸。为什么?

我在一个单独的文件中运行一个带有支持函数的 Grape API 服务器。我的目标是在服务器启动时创建一个在支持函数中定义的长期运行的独立后台进程,该进程会定期 ping 数据库并在找到具有特定标志的数据时执行一些操作。在服务器作为守护进程运行之前,这可以完美地工作。当作为守护进程运行时,对服务器的每次调用都会创建一个僵尸进程。

为什么?我已经阅读了关于僵尸、 fork 等的所有内容,但一定是遗漏了一些关键概念......

机架配置 (config.ru)

require './server.rb'

run Application::API

葡萄服务器(server.rb)

require_relative 'support.rb'
module Application
class API < Grape::API
helpers do
def current_runner
@current_runner ||= Run.new
end
# ...
end
resource :tests do
post :create do
current_runner # <= Edit: forgot to copy this over
@current_runner.create
end
get :lookup do
current_runner # <= Edit: forgot to copy this over
@current_runner.lookup
end
# ...
end
end
end

支持函数(support.rb)

class Run
def initialize
# ...
test_untested
end
# ... other non-forked functions including 'lookup' and 'create'
def test_untested
# Text file with process ID to protect from duplicate listeners
pid = ""
File.open("processid.txt", "r") do |f|
f.each_line do |line|
pid << line
end
end
pid = pid.to_s.gsub(/[^0-9]/, "").to_i
# If the process responds to kill signal 0
# a listener is still alive, and we need to exit
pid_active = nil
unless pid < 100
begin
pid_active = true if ((Process.kill 0, pid) > 0)
rescue Errno::ESRCH => e
pid_active = false
end
end
unless pid_active
Process.fork do # Tried Process.daemon -- it never runs.
Process.detach(Process.pid) # <= Also tried 'Process.setsid' instead ...
# Application logic ...
end
end
end
end
r = Run.new

编辑:仅供引用:我在 2 核 32 位 CentOS 6.5 服务器上。

最佳答案

是否有助于去除

r = Run.new 

在support.rb的底部

当您需要“support.rb”时,运行 server.rb 的进程将自动生成一个新进程,它将通过执行文件底部的行来运行 Run 类。

关于ruby - 为什么 Ruby 服务器仅在守护进程时才会产生僵尸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22503449/

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