$ ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]
これはスクリプトの重要な行です (/etc/munin/plugins/nginx_status_codes.rb:31):
File.open("/var/log/nginx/access.log", File::RDONLY).readlines.each do |line|
私のアクセス ログには、グローバルな読み取り権限があります。
$ ls -lha /var/log/nginx/access.log
-rw-r--r-- 1 www-data adm 49M May 1 15:56 /var/log/nginx/access.log
通常のユーザーとして端末から実行すると、スクリプトは機能します...
$ /etc/munin/plugins/nginx_status_codes > /dev/null && echo $?
0
...しかし、Munin ( rootとして実行) で実行すると失敗します:
2012/05/01-15:54:05 [3988] /etc/munin/plugins/nginx_status_codes:31:in `initialize': Permission denied - /var/log/nginx/access.log (Errno::EACCES)
2012/05/01-15:54:05 [3988] from /etc/munin/plugins/nginx_status_codes:31:in `open'
2012/05/01-15:54:05 [3988] from /etc/munin/plugins/nginx_status_codes:31
ファイルのアクセス許可を 777 などに設定した場合も失敗します。私は、Ruby が愚かで、間違った例外 (Errno:EACCES) を報告し、実際の問題を偽装しているだけだと考えています。しかし、それは何でしょうか?
更新: スクリプトを root:root が所有することで「修正」しようとしましたが、sid/gid ビットが設定されていても、権限が拒否されて失敗しました。