判活用 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。关键业务必须再叠加真实探针(例如访问健康检查接口)才能作为发布门禁。
脚本判活用退出码而不是解析状态文本:不同的查询子命令分别回答「当前在跑吗」「开机自启吗」「启动失败过吗」,三者合起来才能完整描述单元状态。判断单元本身是否存在要靠列出单元的命令,光看退出码无法区分「不存在」与「存在但已停止」。