CLI AI

重启服务后,真正确认它起来了

2026-07-18

sudo systemctl restart nginx && systemctl is-active nginx 会重启服务,并用一个词告诉你它是不是真的在跑。重启本身成功时没有输出,进程一秒后就死掉时同样没有输出,所以检查必须是单独的一条命令——而且单元名打错时 is-active 也回答 inactive,大多数人就是在这里骗了自己。

1. 重启,并在同一行里检查

clai
$ clai 重启 docker 并告诉我它是否起来了→ sudo systemctl restart docker && systemctl is-active dockeractive

restart 成功时什么也不打印,而沉默什么都证明不了。is-active 返回一个词,退出码为 0,正好适合放在 && 后面。

2. 陷阱:单元名打错了

clai
$ clai 检查 nosuch 服务是否在运行→ systemctl is-active nosuch.serviceinactive

不存在的单元回答 inactive,退出码是 4,而不是"unit not found"。在脚本里这会被读成"服务停着",而事实上你只是名字写错了。status 就诚实得多:Unit nosuch.service could not be found.

3. status 到底在告诉你什么

clai
$ 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
$ clai 以机器可读的方式显示 docker 状态→ systemctl show -p ActiveState,SubState,MainPID,NRestarts dockerActiveState=activeSubState=runningMainPID=5425NRestarts=0

show 不为人类做任何排版,因此不会被重排漂亮输出的 systemd 升级弄坏。NRestarts 在涨,是 Restart= 策略正在掩盖崩溃循环的最快信号。

5. 找出所有失败的单元

clai
$ clai 显示失败的服务→ systemctl --failed  UNIT              LOAD   ACTIVE SUB    DESCRIPTION● logrotate.service loaded failed failed Rotate log files

短而中肯。针对单个单元,systemctl is-failed <名字> 会打印 failed 并以退出码 0 结束——前提是它确实处于该状态。

6. 清掉 failed 状态

clai
$ 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 会把"重启一下,再告诉我起来没有"变成两条命令,并在执行前先显示出来。一行安装。