sudo systemctl restart nginx && systemctl is-active nginx 会重启服务,并用一个词告诉你它是不是真的在跑。重启本身成功时没有输出,进程一秒后就死掉时同样没有输出,所以检查必须是单独的一条命令——而且单元名打错时 is-active 也回答 inactive,大多数人就是在这里骗了自己。
1. 重启,并在同一行里检查
$ clai 重启 docker 并告诉我它是否起来了→ sudo systemctl restart docker && systemctl is-active dockeractive
restart 成功时什么也不打印,而沉默什么都证明不了。is-active 返回一个词,退出码为 0,正好适合放在 && 后面。
2. 陷阱:单元名打错了
$ clai 检查 nosuch 服务是否在运行→ systemctl is-active nosuch.serviceinactive
不存在的单元回答 inactive,退出码是 4,而不是"unit not found"。在脚本里这会被读成"服务停着",而事实上你只是名字写错了。status 就诚实得多:Unit nosuch.service could not be found.
3. status 到底在告诉你什么
$ clai 显示 docker 服务的状态→ systemctl status docker● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled) Active: active (running) since Mon 2026-08-24 14:15:54 +07; 3 days ago Invocation: ca41df104d0f46f5a69c964621baf011TriggeredBy: ● docker.socket Docs: https://docs.docker.com
有意义的是两行。Loaded 说明单元文件找到了,enabled 表示开机自启。Active 里带着运行时长:如果你一分钟前才重启,它却显示几秒,说明服务崩过一次又自己起来了。
4. 给脚本看的检查,不是给眼睛看的
$ clai 以机器可读的方式显示 docker 状态→ systemctl show -p ActiveState,SubState,MainPID,NRestarts dockerActiveState=activeSubState=runningMainPID=5425NRestarts=0
show 不为人类做任何排版,因此不会被重排漂亮输出的 systemd 升级弄坏。NRestarts 在涨,是 Restart= 策略正在掩盖崩溃循环的最快信号。
5. 找出所有失败的单元
$ clai 显示失败的服务→ systemctl --failed UNIT LOAD ACTIVE SUB DESCRIPTION● logrotate.service loaded failed failed Rotate log files
短而中肯。针对单个单元,systemctl is-failed <名字> 会打印 failed 并以退出码 0 结束——前提是它确实处于该状态。
6. 清掉 failed 状态
$ clai 清除 logrotate 服务的失败状态→ sudo systemctl reset-failed logrotate.service
只要状态没清,单元就一直留在 --failed 列表里,而 StartLimitBurst 计数器可能以"start request repeated too quickly"拒绝新的启动尝试。reset-failed 会把计数器归零并把单元移出列表。
Gotchas
- 重启后的沉默什么都证明不了。 服务健康和一秒即死这两种情况下,
systemctl restart都只给你一片空白。验证永远是另一条命令。 is-active分不清打错名字和服务停止。 两者都回答inactive。退出码不同——不存在的单元是 4——但肉眼看不见,所以答案出乎意料时就去看status。restart不会重新读取改过的单元文件。 编辑.service之后需要sudo systemctl daemon-reload,否则 systemd 启动的还是旧版本,而你会在一个早已改好的配置里找错。
Related questions
restart 和 reload 有什么区别? reload 是请服务自己重读配置而不断开连接;restart 直接杀掉进程再启动。单元不支持 reload 时,reload-or-restart 会挑能用的那个。
怎么看服务为什么没起来? journalctl -u <名字> -n 50 -o cat 会显示日志最后几行且不带时间前缀——原因通常就在里面。
怎么确认它能挺过重启? systemctl is-enabled <名字> 回答 enabled 或 disabled。此刻正在跑的服务完全可能是 disabled,重启机器后就再也不见。
See also
CliAI 会把"重启一下,再告诉我起来没有"变成两条命令,并在执行前先显示出来。一行安装。