运行 守护进程时 Puma 不记录

Puma not logging when running daemon

当 运行 Puma 作为守护进程时(即使用 -d 标志),Puma 似乎不会登录到 stdout_redirect.

指定的位置

有没有人以前见过这种行为,如果有,找到了一种解决方法来为 Puma 生成正确的日志文件(特别是 stdout_redirect 到位,特别是 Ruby Rails申请)?

stdout_redirect 不起作用的原因是,当您 运行 rails server -d 时,config/puma.rb 永远不会 运行。您可以通过更改端口号或什至在文件中引入语法错误来亲自演示这一点。

Puma 运行s 作为 Rack 服务器,因此由 Rack 中间件启动。 Rack code只是使用核心RubyProcessclass分离进程:

def daemonize_app
  Process.daemon
end

不幸的是,Process.daemon 默认做两件事:

  1. 将当前工作目录更改为根目录 ('/')。
  2. 将 stdout 和 stderr 重定向到 /dev/null

因此,当 Puma 服务器初始化时,所有进程输出都被合并,并且由于 /config/puma.rb 不存在,puma 回退到其硬编码的默认设置。

如果您临时破解 rack 代码以覆盖 chdir 行为,您实际上可以演示您想要的行为:

def daemonize_app
  Process.daemon(true)
end

如果 .daemon 的第一个参数是 true 它不会更改当前工作目录,因此 config/puma.rb 得到 运行.

缺少某种丑陋的 Rack 猴子补丁,一个(可能也是丑陋的)解决方法是跳过 -d 选项并在 config/puma.rb 中滚动你自己的。例如:

# ... rest of the puma config

return unless ENV['DAEMONIZE_PUMA'].present?

puts 'Running puma as a daemon...'
Process.daemon(true)

然后:

% export DAEMONIZE_PUMA=true
% rails server
=> Booting Puma
=> Rails 6.1.4 application starting in development
=> Run `bin/rails server --help` for more startup options
Running puma as a daemon...
% tail log/puma.out
=== puma startup: 2021-07-17 10:03:37 +1200 ===