要让 systemd 服务真正优雅停止,关键是配置 timeoutstopsec 和 killmode 并确保应用响应 sigterm:设 timeoutstopsec=30、killmode=process,避免 execstop 强杀,验证连接自然释放与日志提示。

要让 systemd 服务真正优雅停止,关键不是单纯延长等待时间,而是配合正确的信号行为与合理的超时窗口。默认 90 秒的 TimeoutStopSec 往往不够用,尤其对 Nginx、Java 应用或数据库这类需完成连接处理、状态保存的服务。
查看当前服务的停止超时设置
执行命令确认实际生效值:
systemctl show 服务名.service | grep TimeoutStopSec
注意:TimeoutSec 若被设置,会同时覆盖启动和停止超时;TimeoutStopSec 优先级更高、更精准。
修改 TimeoutStopSec 并启用优雅终止逻辑
使用覆盖方式编辑,避免污染原始 unit 文件:
sudo systemctl edit 服务名.service
填入类似内容(以 Nginx 为例):
[Service] TimeoutStopSec=30 KillMode=process
- TimeoutStopSec=30:给主进程 30 秒完成优雅退出(比默认 90 秒更合理,避免无意义等待)
- KillMode=process:只向 master 进程发 SIGTERM,由它协调 worker 逐步退出,不强制中断连接
保存后重载并重启:
sudo systemctl daemon-reload<br>sudo systemctl restart 服务名.service
验证是否真正优雅停止
停止服务后,观察连接是否自然释放:
- 检查 ESTABLISHED 连接数是否持续下降:
ss -tn state established | grep :端口号 - 确认端口是否最终释放:
ss -tuln | grep :端口号(应无输出) - 查看日志是否有 “gracefully shutting down” 或 “exiting” 类提示(如 Nginx 的
nginx: [notice] exiting)
配合应用层做好信号响应
systemd 只负责发信号和计时,真正“优雅”取决于服务自身:
- 确保服务监听 SIGTERM(不是仅响应 SIGINT),并在收到后关闭新请求入口、等待旧连接完成
- 避免在
ExecStop=中手动 kill 子进程——这会绕过服务原生逻辑,破坏优雅性 - 若服务无内置优雅退出支持,需自行编写轻量脚本封装,但优先推荐升级或配置原生支持的服务版本











