从 20.04 开始,systemd 服务定义如下apache2
(focal-updates Launchpad 链接) 用于apachectl stop
ExecStop。这对应于立即执行的连接中断 TERM 信号,而不是优雅的WINCH关闭信号由...提供apachectl graceful-stop
。
为什么会这样?在我看来,默认情况下执行正常关闭更明智,尤其是因为同一个 systemd 服务文件指定 ExecReload 进行重启graceful
而不是突然重启restart
。此外,nginx
使用正常关机 QUIT 信号为自己的ExecStop 配置。
某些邮件列表中可能确实有关于此决定的记录讨论,但我刚开始探索 Ubuntu 开发社区平台,所以我还不知道在哪里可以找到。(也许这是从 Debian 继承的设计决策,但我也说不准。)
作为次要问题:如果我想更新 Apache(或任何 Ubuntu systemd 服务)的此服务配置,我该如何以安全的“Ubuntu 认可”的方式进行?(即确保它不会被更新等覆盖)
答案1
更新:Debian 错误#974665已解决,因此从 Debian 不稳定版本 2.4.46-2 开始,httpd 现在graceful-stop
默认使用。我预计 Ubuntu 将从 21.04 开始继承此更改。
好吧,我已经找到了解决 Ubuntu 和 Debian 开发平台的方法。
Ubuntu 从 Debian 继承了这个 systemd 配置,并且我已经将为 apache2 配置 systemd 的初始工作追溯到 Debian 错误 #798430。在讨论中,最初提议的补丁实际上指定了graceful-stop
/ SIGWINCH
;然而,最终提交的更改就是我们现在所拥有的,并且没有具体提到为什么最后使用了非优雅命令。我发现了另一个更早的错误报告,#641206,要求对 init.d 进行类似的更改,Debian 维护者回复了,解释了为什么当时不可行。我不确定这是否也适用于 systemd;无论如何,我已经提交了#974665。
至于后续关注的问题,似乎可以借助 Debian 来实现‘消遣’和dpkg-divert
工具。更新:虽然“转移”可能有效,但覆盖 systemd 配置的更简单、更常规的方法是使用systemctl edit
;参见关于覆盖 systemd 服务的答案。