вторник, 1 ноября 2016 г.

Некорректный перезапуск httpd в logrotate

Проблема состоит в том, что с определенной периодичностью (раз в неделю) падает apache, который приходится потом поднимать вручную.

В error.log:
[Sun Oct 30 04:33:05 2016] [notice] SIGHUP received.  Attempting to restart
[Sun Oct 30 04:33:05 2016] [notice] seg fault or similar nasty error detected in the parent process

Если запустить вручную service httpd restart, то апач поднимается и нормально работает.

Решение.
Определяем периодичность отсылки SIGHUP:
# cat /var/log/httpd/error_log* | grep "SIGHUP received"
[Sun Oct 16 03:09:08 2016] [notice] SIGHUP received.  Attempting to restart
[Sun Oct 23 03:18:08 2016] [notice] SIGHUP received.  Attempting to restart
[Sun Oct 30 04:33:05 2016] [notice] SIGHUP received.  Attempting to restart

Тут видим что это происходит каждую неделю, значит крон тут замешан как-то.
Смотрим логи крона:
# cat /var/log/cron* | grep "Oct 30 04:33"
...
Oct 30 04:33:02 apache2 run-parts(/etc/cron.daily)[25626]: starting logrotate
# cat /var/log/cron* | grep "Oct 23 03:18"
...
Oct 23 03:18:01 apache2 run-parts(/etc/cron.daily)[13512]: starting logrotate

Видим, что в это время, когда был послан SIGHUP апачу, запускалось задание /etc/cron.daily/logrotate.

Смотрим что у нас в этом скрипте посылает SIGHUP:
# cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
...
   postrotate
      /sbin/service httpd reload > /dev/null 2>/dev/null || true
   endscript
}

Пробуем воспроизвести ситуацию:
# /sbin/service httpd reload
# tail -2 /var/log/httpd/error_log
[Sun Oct 30 11:46:08 2016] [notice] SIGHUP received.  Attempting to restart
[Sun Oct 30 11:46:08 2016] [notice] seg fault or similar nasty error detected in the parent process
# service httpd status
httpd dead but pid file exists

Видно что проблема происходит из-за некорректного httpd reload.
В данном случае решение мое заменить команду reload на restart.
# cat -n /etc/logrotate.d/httpd | grep restart
7 /sbin/service httpd restart > /dev/null 2>/dev/null || true

Почему так происходит, я так и не понял.
Где-то видел что это косяк mpm-event может быть, но в моем случае использовался prefork.
Возможно проблема была в init-скрипте апача, но я его не смотрел.

Комментариев нет: