防火墙都关了status还显示failed?systemd三种状态先读懂再动手

“为了关防火墙,systemctl stop firewalld 敲完,顺手 status 看一眼——Active 一栏赫然红字 failed。明明是我自己动手关的,怎么还’失败’了?是没关掉,还是把系统搞出了问题?“在 Linux 服务器上敲命令的人,头一回见到这行红字多半心里一紧。其实八成不是事故,是 status 这行字的语义没读懂。

先把这行字拆开讲。systemctl status 输出里 Active 那一栏,常见的有四种样子:active (running),服务正在跑;active (exited),一次性任务型服务跑完正常退出了,也属于健康状态;inactive (dead),服务停了,而且停得干干净净;failed,服务停了,但停得"不体面”——退出码不是零,或者被系统判定为异常终止。关键就在 failed 这个词:它描述的是"上一次退出时留下的记录”,不等于"现在出事了",更不等于"你的操作失败了"。关掉服务后看到 failed,多数情况是这个服务上次退出时信号或退出码不干净,记录留在了那儿。另外还有一种提示叫 Unit is not loaded,是服务单元文件压根不存在时的正常回报,也不是报错。

真遇到红色 failed,按这个顺序看:

  1. 先看完整输出,别只盯 Active 一行。Loaded 行告诉你这个服务有没有、是不是 disabled;下面跟的几行日志摘要,往往已经把退出原因写了大半。
  2. 用 journalctl -u firewalld –no-pager 翻这个服务自己的日志,看真正的退出记录:是正常停止时的残留,还是运行时报错被杀——两种结论完全不同。
  3. 要一个干脆的答案,就问 is-active:systemctl is-active firewalld,回一个 inactive 就是停了,回 active 才是还在跑。
  4. 确认只是记录残留的,用 systemctl reset-failed 把失败标记清掉,再看 status 就恢复干净的 inactive (dead) 了。
  5. 判读口诀记三条:failed=上次退出不体面,inactive (dead)=干净停止,active (exited)=一次性任务正常完事。先分清状态,再决定要不要动手,别一见图红就开始重启服务。

之前讲过服务启动报"Job for xxx failed"时的排查通法——那是"想启动起不来"顺着报错往下挖的路数;本篇讲的是反过来的场景:主动停了服务,status 里那行红字到底是什么意思。一个是救火,一个是读表,凑齐了 systemd 的两头的账。

Linux 服务器上这类"看错表就误操作"的坑不少,真按红字去反复重启服务,反而把正常的停机状态搅出问题。做 Linux 服务器代维时,贵州诚鑫致达科技的工程师会先把状态语义这类基础账给客户讲透,巡检报告里的每行结论都有出处。你在服务器上见过哪些"看着吓人其实正常"的输出?评论区聊聊。