最可靠方法是用 systemctl is-enabled 命令判断:返回 enabled 表示已配置开机自启,disabled 表示未启用,masked 表示被强制禁用,static 表示依赖触发;须带 .service 后缀并屏蔽错误输出,不可用 is-active 或 status 中的 enabled 字样替代。

直接用 systemctl is-enabled 命令判断最可靠,它返回明确的字符串值,适合脚本中做条件分支。
单个服务是否开机自启:用 is-enabled 判断
执行命令后,根据返回值做逻辑处理:
- enabled:已配置开机自启,可作为 true 分支
- disabled:未启用,可作为 false 分支
- masked:被强制禁用,通常需人工干预,不建议自动恢复
- static:不能独立启用,依赖其他服务触发,不属于“用户配置的开机自启”范畴
示例(Bash 脚本中):
echo "Nginx 已设为开机自启"
else
echo "Nginx 未设为开机自启"
fi
批量检查多个服务的开机状态
可在循环中逐个调用 is-enabled,避免误判:
- 服务名必须带 .service 后缀,防止匹配到 timer/socket 等同名单元
- 加 2>/dev/null 屏蔽“Unit not found”等报错,保持脚本健壮
- 不建议用 grep 匹配 list-unit-files 输出来替代——结果易受 static/masked 干扰
简写示例:
for svc in sshd nginx cron; doif systemctl is-enabled "$svc.service" | grep -q enabled; then
echo "$svc: ✅ 开机自启"
else
echo "$svc: ❌ 未配置"
fi
done
注意别混淆“开机自启”和“当前运行”
条件判断目标是“系统重启后是否会自动拉起”,不是“现在有没有在跑”。所以:
- 不要用 systemctl is-active 或 systemctl list-units --state=running 替代 —— 它们只反映当前状态
- 不要看 systemctl status xxx 输出里 “Loaded” 行末尾的 enabled —— 那是 vendor preset 快照,可能被本地配置覆盖
- 真正权威依据只有 systemctl is-enabled 和 systemctl list-unit-files --type=service











