4

通常我可以写日志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.rb并运行。xyz.rb为什么一个日志不能像另一个日志一样?

4

1 回答 1

9

这就是原因。从守护进程文档

我已为您将相关部分加粗:

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

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

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

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

于 2012-06-28T05:29:56.703 回答