最直接查看当前运行服务的命令是systemctl list-units --type=service,默认仅显示已加载且活跃或失败的服务;加--state=running可精确筛选正在运行的服务,加--all则包含已加载但未启动的服务。

systemctl list-units --type=service 显示所有服务状态
这是最直接查当前运行中服务的命令,systemctl 默认只显示已加载且处于活跃(active)或失败(failed)状态的服务,不会列出被禁用但已安装的服务。
常见错误是只跑 systemctl list-units 不加 --type=service,结果混着 sockets、timers 一堆非服务项,眼花缭乱。加了类型过滤后才干净。
- 加
--state=running可进一步缩小到真正正在运行的(排除 inactive 但 loaded 的) - 加
--all会显示 loaded 但 inactive 的服务(比如刚装好还没 start 过的) - 注意:
active (running)表示进程在跑;active (exited)是那种一次性服务(如rc-local.service),执行完就退出,也算“活跃”
systemctl is-active 和 systemctl is-enabled 判断单个服务
查某个服务是否正在运行,别用 ps aux | grep xxx —— 容易漏掉 fork 后 daemonize 的进程,也绕过了 systemd 的状态管理逻辑。直接问 systemd 更准。
systemctl is-active <code>nginx 返回 active 或 inactive 或 failed;systemctl is-enabled <code>nginx 返回 enabled / disabled / static(后者表示不能 enable,但可被其他服务依赖触发)。
- 脚本里做判断时,优先用
systemctl is-active --quiet <code>nginx配合$?,比解析输出字符串更稳 -
is-enabled不代表当前在运行,只说明开机是否自启;is-active不代表开机自启,只反映此刻状态 - 有些服务(如
ModemManager)默认enabled但实际不运行——它等硬件插入才启动,此时is-active是inactive
journalctl -u 查服务日志时容易忽略的细节
光看 systemctl status <code>ssh 只能看到最近几行摘要,真出问题得翻日志。但 journalctl -u <code>ssh 默认只查本次 boot 的记录,机器重启过就看不到上次失败原因。
- 加
--all才能查所有历史(包括早前 boot 的),但默认日志保留策略可能已删掉旧条目 - 加
-n 50限制行数,不然一刷几百行根本没法定位;加--since "2 hours ago"比盲目翻更高效 - 如果服务刚 crash,
journalctl -u <code>ssh--no-pager | tail -20 比交互式翻页更快看到 exit 原因 - 注意:日志里出现
Failed with result 'exit-code'说明进程自己退出了;'signal'是被 kill 掉的,得查是不是 OOM 或手动 kill 过
systemctl status 输出里哪些字段真正有用
systemctl status <code>docker 输出信息多,但真正该盯住的就几个地方:
-
Loaded:后面的路径是否真实存在?如果显示disabled却又指向/dev/null,说明服务文件被 mask 了(systemctl mask <code>docker导致) -
Active:看状态+时间,比如active (running) since Mon 2024-04-01...—— “since” 时间异常久?可能服务卡死没响应,只是 systemd 还没标记为 failed -
Process:行末 PID 是否还在ps里?不在就说明进程崩了但 systemd 还没来得及更新状态(极短时间窗口) - 最后一段的
Hint: Some lines were ellipsized是个信号:日志被截断了,必须用journalctl -u <code>docker-n 100 补全
服务状态不是非黑即白,activating (auto-restart) 或 deactivating 这类中间态持续太久,往往意味着依赖没拉起来或者 pre-start 脚本卡住——这时候看 systemctl list-dependencies <code>docker 比瞎猜有用。










