$ 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位,它设置为失败并且权限被拒绝。
答案 0 :(得分:1)
没关系。问题是logrotation已经到位,并且它不时地改变了日志文件权限:
$ cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi; \
endscript
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}