2012-05-01 3 views
0
$ ruby -v 
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux] 

Это важная строка в скрипте (/etc/munin/plugins/nginx_status_codes.rb:31):Рубин умудряется неудачу открытие 644 файла, как только для чтения

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 (который работает как корень):

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, которые ему удается сбой с разрешения.

+1

Я не знаком с Мунином. Это действительно работает как root? Не переключается ли он на другой идентификатор пользователя после инициализации? Если это так, то имеет ли этот идентификатор пользователя доступ к каталогам/var,/var/log и/var/log/nginx? – theglauber

+0

У меня есть Munin, работающий как пользователь, так и группа «root» в соответствии с munin.cfg. Но, возможно, вы правы, но может случиться, что он удаляет пользователя root при запуске скрипта. То, что я нахожу странным, это то, что я могу запускать сценарий как обычный пользователь без проблем с разрешением. – hcalves

ответ

1

Nevermind. Проблема заключалась в том, что логротация была на месте, и она меняла разрешения на регистрацию файлов время от времени:

$ 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 
} 
+0

Почему 'SIGUSR1'? – Reactormonk

+0

Чтобы сигнализировать nginx для открытия файлов журнала: http://wiki.nginx.org/CommandLine#Stopping_or_Restarting_Nginx – hcalves