【问题标题】:ruby - can't write to logs in daemonsruby - 无法写入守护进程的日志
【发布时间】:2012-06-29 13:41:04
【问题描述】:

通常我可以用Logger写日志:

//abc.rb
require 'logger'
logger = Logger.new('foo.log')

$./abc.rb

但在Daemons 中出现权限错误:

//xyz.rb
require 'logger'
require 'daemons'

Daemons.run_proc('xyz') do
  logger = Logger.new('foo.log')
end

$./xyz.rb
/home/raincole/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/logger.rb:599:in `initialize': Permission denied - foo.log (Errno::EACCES)
from /home/raincole/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/logger.rb:599:in `open'
from /home/raincole/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/logger.rb:599:in `create_logfile'
from /home/raincole/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/logger.rb:594:in `open_logfile'
from /home/raincole/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/logger.rb:549:in `initialize'
from /home/raincole/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/logger.rb:314:in `new'
from /home/raincole/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/logger.rb:314:in `initialize'

我在同一目录中以相同的身份运行 abc.rbxyz.rb。为什么一个不能像另一个一样记录?

【问题讨论】:

  • 守护进程是否设置了有效的用户ID?

标签: ruby logging daemon daemons


【解决方案1】:

这就是原因。来自the Daemons documentation

我已经为您添加了粗体

守护进程在内部对我的守护进程做了什么?

从技术角度来看,守护进程在创建守护进程时会执行以下操作:

  1. 派生一个子进程(并在需要时退出父进程)
  2. 成为会话负责人(将程序与控制终端分离)。
  3. 派生另一个子进程并退出第一个子进程。这可以防止获得控制终端的可能性。
  4. 将当前工作目录更改为“/”。
  5. 清除文件创建掩码(将 umask 设置为 0000)。
  6. 关闭文件描述符(如果可能,重新打开 STDOUT 和 STDERR 以指向日志文件)。

因此,在启动守护程序后,您应该将当前工作目录 (Dir.chdir) 更改为要用于记录的目录,或者使用绝对路径作为日志文件。

【讨论】:

  • 我不推荐chdir。守护程序(理想情况下是所有应用程序)应始终使用绝对路径。访问相对路径通常是错误的来源。
猜你喜欢
  • 2011-07-25
  • 2020-08-14
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多