怎么优化 systemd shutdown 超时时间防止关机卡死

文章导读
修改 /etc/systemd/system.conf 中的 DefaultTimeoutStopSec 参数是解决 systemd 关机卡死的主要方法,适用于服务停止阶段耗时过长的场景。风险在于设置过短可能导致服务未保存数据就被强制杀死。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

修改 /etc/systemd/system.conf 中的 DefaultTimeoutStopSec 参数是解决 systemd 关机卡死的主要方法,适用于服务停止阶段耗时过长的场景。风险在于设置过短可能导致服务未保存数据就被强制杀死。

先说结论:通过调整全局停止超时阈值,可以避免单个服务无响应导致整个关机流程挂起。

  • 适合:关机日志显示 Timed out stopping 或关机等待时间超过 90 秒的场景
  • 先准备:备份原配置文件,确认当前超时设置值
  • 验收:修改后重启系统,观察关机日志和服务停止行为

命令速用版

查看当前生效的超时设置:

systemctl show -p DefaultTimeoutStopSec

临时修改配置(需重启生效):

sudo sed -i 's/^#DefaultTimeoutStopSec=.*/DefaultTimeoutStopSec=30s/' /etc/systemd/system.conf

为什么会这样

systemd 在关机时会向所有运行中的服务发送停止信号,若服务未在限定时间内退出,关机流程会被阻塞。默认情况下,systemd 等待服务停止的超时时间通常为 90 秒,若服务进程僵死或逻辑卡滞,系统会等待直至超时后才强制杀死进程。

怎么优化 systemd shutdown 超时时间防止关机卡死

分步处理

第一步:备份配置文件

sudo cp /etc/systemd/system.conf /etc/systemd/system.conf.bak

第二步:编辑配置文件

使用编辑器打开 /etc/systemd/system.conf,找到 DefaultTimeoutStopSec 行。若该行被注释,去掉注释符号 # 并修改数值。建议设置为 30s 至 60s 之间,不要低于 10s。

DefaultTimeoutStopSec=30s

第三步:重启系统使配置生效

修改 system.conf 需要重新初始化 systemd 管理器,最稳妥的方式是重启系统。

怎么优化 systemd shutdown 超时时间防止关机卡死
sudo reboot

第四步:检查个别服务配置

若特定服务仍需更长时间停止,可在该服务的 unit 文件中单独设置 TimeoutStopSec,优先级高于全局配置。

怎么验证是否生效

执行以下命令确认参数已加载:

systemctl show -p DefaultTimeoutStopSec

输出应显示修改后的数值,例如 DefaultTimeoutStopSec=30s。下次关机时,查看日志 /var/log/syslog 或 journalctl -b -1,确认服务停止阶段的等待时间是否缩短,且没有出现长时间的 Timed out stopping 报错。

怎么优化 systemd shutdown 超时时间防止关机卡死

常见坑

不要将超时时间设置为 0 或过短,这会导致服务来不及清理临时文件或关闭连接就被 SIGKILL 强制终止,可能引发数据损坏。部分数据库或有状态服务需要明确的优雅退出时间,建议针对此类服务单独配置 Unit 文件中的 TimeoutStopSec,而不是全局调低。

常见问题

默认超时时间是多少?

systemd 上游默认编译值通常为 90 秒,但不同发行版可能在打包时修改此默认值。

修改后需要重启吗?

需要,/etc/systemd/system.conf 是 systemd 管理器启动时读取的配置,修改后必须重启系统才能生效。

如何单独设置某个服务的超时?

在该服务的 unit 文件中添加 TimeoutStopSec= 参数,或使用 systemctl edit 服务名 进行覆盖配置。

参考来源

  • systemd.system.conf(5) Man Page, freedesktop.org, URL: https://www.freedesktop.org/software/systemd/man/systemd.system.conf.html
  • Arch Wiki systemd, URL: https://wiki.archlinux.org/title/systemd