关机到底卡在哪一步
Linux 关机是 systemd 逐个停止单元、再卸载文件系统的过程。卡住基本只有两类原因:某个服务停止超时(不响应 SIGTERM,或 ExecStop 脚本自己卡住),以及文件系统卸载在等 IO 完成(网络存储链路断开时尤其明显)。控制台通常会直接打印正在等待的单元名与已等待时长,这是最有价值的一条线索。
基本信息
| 典型提示 | A stop job is running for XXX(后跟已等待时长) |
|---|---|
| 日志回溯 | journalctl -b -1 查看上一次启动周期的结尾 |
| 关键参数 | 单元里的 ExecStop 与 TimeoutStopSec |
| 网络挂载 | NFS/CIFS 断链会长时间等待卸载 |
| 权限要求 | root(查看与修改单元配置) |
典型使用场景
- 执行 reboot 或 shutdown 后长时间停在 stop job 提示上
- 虚拟机通过平台发起关机一直不返回
- 排查是哪个服务拖慢了整条关机流程
- NFS 挂载的服务器不可达导致关机卡死
- 给停止慢的应用设置合理的超时上限
定位与处理
定位与处理
# 卡住时控制台会提示:A stop job is running for XXX(NNs / 1min 30s)
systemctl list-jobs # 当前仍在执行的单元任务
journalctl -b -1 --no-pager | tail -50 # 上一次启动周期的末尾日志
systemctl cat app-web | grep -E 'ExecStop|TimeoutStopSec' # 停止逻辑与超时值
systemctl edit app-web # 用 drop-in 覆盖,不改原始单元文件
# 在打开的编辑器里写入:
# [Service]
# TimeoutStopSec=30
systemctl daemon-reload # 覆盖生效
systemctl list-units --type=mount # 核对挂载单元,确认是否存在网络存储卡点判读
| 现象 | 含义 | 处理 |
|---|---|---|
| stop job 提示带单元名 | 该单元停止未完成 | 查它的 ExecStop 与 TimeoutStopSec |
| 停在 umount 阶段 | 文件系统卸载等待 IO | 检查网络存储链路与挂载选项 |
| 每次都是同一服务 | 该服务停止逻辑有问题 | 交研发修脚本或设超时上限 |
| 偶发且单元不同 | 多为 IO 抖动或负载高峰 | 结合存储层与负载记录分析 |
NFS 等网络挂载在网络中断时会长时间等待:挂载时评估软挂载相关选项,或在关机前先手动 umount 掉已经断链的网络存储。
直接长按电源断电有数据损坏风险:优先等超时自行结束,或者切到其他终端手动卸载卡住的挂载,最后才考虑强制断电。