首页/系统/Linux 运维命令速查/systemctl is-active/is-enabled 脚本判活
systemd 与服务42 条

systemctl is-active/is-enabled 脚本判活

脚本里判断服务状态用 is-active(输出 active/failed 并给退出码)、is-enabled、is-failed;不要解析 status 文本。

Linux 运维命令速查系统更新于 2026-10-13

判活用 is-active

在脚本里判断服务状态要用 is-active 这类查询子命令:它输出状态字符串并给出退出码,条件判断可以直接用,而不用去解析 status 的人类可读输出——那部分格式会随版本变化。同族的还有 is-enabled(是否开机自启)、is-failed(是否处于失败状态),三者共同覆盖脚本最关心的三个问题。

基本信息

用途用退出码判断单元是否运行、是否自启、是否失败
语法systemctl is-active|is-enabled|is-failed [--quiet] 单元
返回语义退出码 0 表示状态符合查询,非 0 表示不符合;状态字符串同时打印到标准输出
所属systemd

典型使用场景

  • 启停前的判断:部署脚本先确认服务是否在运行,再决定 restart 还是 start
  • 健康巡检:批量检查关键单元,汇总成一份可用性清单
  • 失败自愈:检出 failed 状态后自动重启并记录日志
  • 发布门禁:切流前确认新实例已处于 active,再继续下一步
  • 自启核对:新机器上线后确认关键服务都已开启自启

常用示例

常用示例
systemctl is-active nginx && echo up || echo down
if systemctl is-active --quiet nginx; then echo 'ok'; else systemctl restart nginx; fi
systemctl is-enabled sshd
systemctl is-failed myapp && systemctl reset-failed myapp   # 失败状态可先复位
systemctl is-active nginx; echo "exit=$?"                    # 看退出码,便于脚本判断

批量检查

批量检查
for s in nginx mysql redis myapp; do
  printf '%-10s %s\n' "$s" "$(systemctl is-active "$s")"
done
# 输出成便于巡检汇总的形式
for s in $(systemctl list-units --type=service --state=running --plain --no-legend | awk '{print $1}'); do
  printf '%s\t%s\n' "$s" "$(systemctl is-active --quiet "$s" && echo ok || echo check)"
done | head

查询子命令对照

子命令回答的问题常见输出
is-active现在是否在运行active / inactive / failed / activating
is-enabled是否开机自启enabled / disabled / static / masked
is-failed是否处于失败状态failed / active
is-system-running系统整体是否就绪running / degraded / maintenance
status人类可读的详细状态格式随版本变化,不适合脚本解析
inactive 与 failed 的区别很重要:前者是没运行,后者是运行过并失败了。自愈脚本通常只对 failed 做复位与重启,对 inactive 的处理要看你是否希望它保持停止。
状态为 active 不等于服务健康:进程活着但端口没监听、接口返回错误码,都仍会显示 active。关键业务必须再叠加真实探针(例如访问健康检查接口)才能作为发布门禁。
脚本判活用退出码而不是解析状态文本:不同的查询子命令分别回答「当前在跑吗」「开机自启吗」「启动失败过吗」,三者合起来才能完整描述单元状态。判断单元本身是否存在要靠列出单元的命令,光看退出码无法区分「不存在」与「存在但已停止」。

易错点

  • 解析 systemctl status 的文本输出:格式与颜色随版本变化,脚本极易碎掉,应改用 is-active 的退出码
  • 把 active 当成健康:进程活着与业务可用是两件事,需要独立探针补齐
  • 对 socket 激活型服务用 is-active 判断:平时它是 inactive,应看对应的 socket 单元
  • 忘记判定「单元不存在」的情况:不存在的单元也会返回非 0,脚本里要区分「不存在」与「存在但停止」
  • 在判活里忽略「失败」这一独立状态:单元启动失败时既非运行也非正常停止,脚本若只判断是否正在运行,会把失败当成已停止而继续执行后续步骤

数据来源与参考

  • man 1 systemctl(is-active 等)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌