Моя система - centos 7.4, с apache 2.4
На основе руководство по apache,apachectl -k graceful
должен быть способом изящного перезапуска apache, но я получил уведомление, как показано ниже:
[root@localhost root]# apachectl -k graceful
Passing arguments to httpd using apachectl is no longer supported.
You can only start/stop/restart httpd using this script.
If you want to pass extra arguments to httpd, edit the
/etc/sysconfig/httpd config file.
В чем проблема?
Как Graceful Restart Apache
в centos 7?
См. Эту страницу на apachectl, которая выглядит новой версией: https://httpd.apache.org/docs/2.4/programs/apachectl.html
Аргумент '-k' передавать не нужно. apachectl graceful
(без -k) отлично работает для изящной перезагрузки / перезапуска на моем поле Centos7 и поле Centos6.
По-видимому, никто не обновил страницу руководства OP, указанную в ее вопросе, который все еще существует, и где команды показаны с аргументом '-k' повсюду (apachectl -k graceful, apachectl -k restart и т. Д.) На этой странице нет объяснений о том, что на самом деле делает аргумент -k.
Но на более новой странице есть эта заметка об apachectl graceful:
Это эквивалентно apachectl -k graceful.
В моем ящике Centos6 я использовал команду service httpd graceful
. Это больше не работало на Centos7. Необходимо использовать apachectl graceful
чтобы сделать аналог на Centos 7. Также apachectl graceful
отлично работает на Centos 6.
Большинство дистрибутивов на основе systemd используют исправленный apachectl
скрипт [1], который делегирует команды systemctl
. Патченный apachectl
команда не поддерживает "сквозной" режим работы, в котором аргументы передаются в httpd
. На странице руководства apachectl отражены исходные не исправленные apachectl
команда, отсюда и несоответствие.
Я рекомендую использовать systemctl
[2] абстракция для запуска и остановки служб.
Таким образом, чтобы корректно перезапустить HTTP-сервер Apache на Centos 7 и других дистрибутивах Linux с использованием systemd, используйте:
sudo systemctl reload httpd.service
Под капотом это вызывает httpd -k graceful
. Вы можете проверить это с помощью этой команды:
$ systemctl cat httpd.service | grep -F ExecReload
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
Чтобы остановить HTTP-сервер Apache:
sudo systemctl stop httpd.service
который, за кулисами, отправляет SIGWINCH
сигнал к httpd
обработать.
Это можно проверить с помощью этой команды:
$ systemctl cat httpd.service \
| grep -E --before-context=1 'ExecStop|KillSignal'
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
В systemd.service
[3] в руководстве говорится, что в этой ситуации, когда ExecStop
опция не указана, "процесс завершается отправкой сигнала, указанного в KillSignal
. "
Зачем SIGWINCH
? Потому что за https://bz.apache.org/bugzilla/show_bug.cgi?id=50669 , Apache использует SIGWINCH
сигнал как триггер «плавного отключения».
Еще одна команда, которая может оказаться полезной для изучения параметров службы, - это show
команда в сочетании с -p, --property
варианты, например:
$ systemctl show httpd.service -p ExecStart -p ExecReload -p ExecStop -p KillSignal
[1] https://git.centos.org/blob/rpms!httpd.git/c7/SOURCES!httpd-2.4.3-apctl-systemd.patch
[2] https://www.freedesktop.org/software/systemd/man/systemctl.html
[3] https://www.freedesktop.org/software/systemd/man/systemd.service.html
Как и в других дистрибутивах Linux, использующих systemd, вы можете управлять httpd с помощью systemctl
. В частности:
systemctl reload httpd
заставит httpd перезагрузить свои файлы конфигурации и перезапустить своих рабочих с новой конфигурацией, точно так же, как graceful
сделал.