我的系统是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.
有什么问题?在 centos 7 中
该如何解决?Graceful Restart Apache
答案1
请参阅 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 上也可以正常工作。
答案2
大多数基于 systemd 的发行版使用已修补的apachectl
脚本 [1],将命令委托给systemctl
。已修补的apachectl
命令不支持将参数传递给 的“直通”操作模式httpd
。apachectl 手册页反映了上游未修补的apachectl
命令,因此存在差异。
我建议使用systemctl
[2]抽象来启动和停止服务。
因此,要正常重启 Centos 7 和其他使用 systemd 的 Linux 发行版上的 Apache HTTP Server,请使用:
sudo systemctl reload httpd.service
在底层,这将调用httpd -k graceful
。您可以使用以下命令进行验证:
$ systemctl cat httpd.service | grep -F ExecReload
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
要停止 Apache HTTP 服务器:
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
[3]手册systemd.service
说,在这种情况下,如果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
答案3
与其他使用 systemd 的 Linux 发行版一样,你可以使用 来管理 httpd systemctl
。特别是:
systemctl reload httpd
将导致 httpd 重新加载其配置文件并使用新配置重新启动其工作程序,正如graceful
所做的那样。