【问题标题】:Ruby manages to fail opening a 644 file as read-onlyRuby 无法以只读方式打开 644 文件
【发布时间】:2012-05-01 19:07:43
【问题描述】:
$ 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 和 even 所拥有的脚本来“修复”它,并设置了 sid/gid 位,但由于权限被拒绝而失败。

【问题讨论】:

  • 我对穆宁不熟悉。它真的以root身份运行吗?初始化后不会切换到另一个用户ID吗?如果是,那么该用户 ID 是否有权访问 /var、/var/log 和 /var/log/nginx 目录?
  • 根据 munin.cfg,我让 Munin 作为用户和组“root”运行。但是您可能是对的,但它可能会在运行脚本时删除 root 用户。我觉得奇怪的是,我可以以普通用户身份运行脚本而不会遇到权限问题。

标签: ruby linux permissions munin


【解决方案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
}

【讨论】:

猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多