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'

私は同じディレクトリで同じIDで実行abc.rbしました。xyz.rb一方が他方と同じようにログインできないのはなぜですか?

4

1 に答える 1

9

これが理由です。Daemonsのドキュメントから。

私はあなたに関連する部分を太字で示しました:

デーモンは私のデーモンで内部的に何をしますか?

技術的な観点から、デーモンはデーモンを作成するときに次のことを行います。

  1. 子をフォークします(必要に応じて、親プロセスを終了します)
  2. セッションリーダーになります(プログラムを制御端末から切り離します)。
  3. 別の子プロセスをフォークし、最初の子を終了します。これにより、制御端末を取得する可能性がなくなります。
  4. 現在の作業ディレクトリを「/」に変更します。
  5. ファイル作成マスクをクリアします(umaskを0000に設定します)。
  6. ファイル記述子を閉じます(可能であれば、ログファイルを指すようにSTDOUTとSTDERRを再度開きます)。

したがって、デーモンを起動した後、現在の作業ディレクトリ(Dir.chdir)をログに使用するディレクトリに変更するか、ログファイルに絶対パスを使用する必要があります。

于 2012-06-28T05:29:56.703 に答える