Проблема
При запуске нескольких экземпляров httpd на одном хосте (то есть, как предлагается в этом посте) с включенным SELinux и в принудительном режиме, использование одной конфигурации logrotate для ротации журнала может завершиться неудачно, если используется скрипт postrotate, подобный следующему:
postrotate /bin/systemctl reload httpd*.service > /dev/null 2>/dev/null || true endscript
Команда «systemctl reload httpd * .service» работает из командной строки, однако политика SELinux не позволяет logrotate перечислять активные службы, соответствующие шаблону httpd * .service, при запуске в качестве задания cron или anacron с отказом AVC в файле audit.log, аналогичном следующему:
type=USER_AVC msg=audit(1523410562.012:837): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='avc: denied { status } for auid=0 uid=0 gid=0 cmdline="/bin/systemctl reload httpd*.service" scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=system_u:system_r:init_t:s0 tclass=system exe="/usr/lib/systemd/systemd" sauid=0 hostname=? addr=? terminal=?'
Решение
Эту проблему можно решить, отправив сигнал USR1 основным процессам httpd.
Это приведет к постепенному перезапуску дочерних процессов httpd, перезагрузке конфигурации и повторному открытию файлов журнала.
Мы можем получить PID основных процессов, прочитав PID-файлы отдельных экземпляров httpd, как указано в их соответствующих файлах конфигурации httpd.conf.
В следующем примере все файлы конфигурации httpd.conf всех экземпляров соответствуют шаблону /etc/httpd/conf/httpd*.conf, а файлы PID соответствуют /var/run/httpd*.pid:
# grep PidFile /etc/httpd/conf/httpd*.conf /etc/httpd/conf/httpd1.conf:PidFile "/var/run/httpd1.pid" /etc/httpd/conf/httpd2.conf:PidFile "/var/run/httpd2.pid" /etc/httpd/conf/httpd3.conf:PidFile "/var/run/httpd3.pid"
Примечание: пожалуйста, убедитесь, что вы настроили шаблон в соответствии со схемой именования, используемой в вашей среде!
Затем скрипт, подобный следующему, можно использовать в разделе postrotate вашего файла конфигурации /etc/logrotate.d/httpd:
# vi /etc/logrotate.d/httpd postrotate for pidfile in $(ls -1 /var/run/httpd*.pid); do PID=$(cat "$pidfile") if grep -qa "/usr/sbin/httpd" /proc/$PID/cmdline; then kill -USR1 $PID fi done || true endscript
Примечание. Обратите внимание, что приведенный выше скрипт является лишь примером и может потребовать изменений в вашей среде.