systemctl list-units --type=service --all可查看所有服务基础状态,需重点筛查active: failed、loaded: not-found/masked等异常;对核心服务须叠加status、journalctl、ss和curl三重验证;批量筛查用命令组合定位failed服务、enabled但inactive服务及配置损坏项。

Linux中查看systemd服务的“健康状态”,不能只看“是否在运行”,而要分层判断:是否加载成功、是否激活、是否稳定运行、日志有无报错。systemd本身不提供统一的“health”字段,但通过组合几个关键命令,就能全面评估每个服务的实际可用性。
一、快速列出所有服务及其基础状态
执行以下命令可看到系统中所有已注册的服务及其当前状态:
- systemctl list-units --type=service --all:显示全部服务(running、exited、failed、inactive等),每行含服务名、加载状态(loaded/dropped)、激活状态(active/inactive/failed)和简短描述
- 加 --state=failed 可聚焦问题项:
systemctl list-units --type=service --state=failed - 加 --state=inactive 可筛查长期未启用但可能被依赖的服务
二、识别真正“不健康”的服务
仅靠列表不够,需重点筛查三类异常信号:
- Active: failed:服务启动失败,是最明确的健康告警;下一步必须查日志
- Loaded: not-found 或 Loaded: bad-setting:配置文件缺失或语法错误,服务无法加载
-
Loaded: masked:服务被显式禁用(如
systemctl mask nginx),start会直接拒绝 - 若 Active: active (exited) 且服务本应常驻(如nginx、sshd),说明它启动后立即退出,属于隐性故障
三、逐个验证关键服务的运行质量
对核心服务(如 sshd、nginx、docker、cron),不能只信“active (running)”,要叠加验证:
- 用 systemctl status 服务名 查看主进程PID、启动时间、最近几条日志——若日志末尾有
Failed with result 'exit-code'或Timeout,即为亚健康 - 用 journalctl -u 服务名 -n 30 -p err 提取最近30行错误级日志,确认是否有持续报错
- 对网络服务,补查端口监听:
ss -tlnp | grep :端口号,防止进程在但端口未绑定 - 对应用服务,做轻量接口探测(如
curl -I http://localhost:8080/health),验证应用层是否响应
四、批量筛查健康风险的实用技巧
终端一行命令即可发现潜在隐患:
- 查所有 failed 服务并显示其最近错误日志:
systemctl list-units --type=service --state=failed --no-legend | awk '{print $1}' | xargs -I{} sh -c 'echo "== {} =="; journalctl -u {} -n 5 -p err 2>/dev/null || echo "(no error logs)"' - 查所有 enabled 但 inactive 的服务(开机自启却没起来):
systemctl list-unit-files --type=service --state=enabled | awk '$2=="enabled"{print $1}' | xargs -I{} sh -c 'systemctl is-active {} | grep -q inactive && echo {}' - 检查服务配置路径是否真实存在:
systemctl list-units --type=service --all --no-legend | awk '$3=="loaded"{print $1}' | xargs -I{} systemctl cat {} >/dev/null 2>&1 || echo "broken unit: {}"











