使用Bash脚本启动Systemctl服务时出现exit status 3错误的原因
错误原因分析与解决办法
错误原因
- systemctl is-active 退出码含义
systemctl is-active命令的退出码对应服务的不同状态:
- 0: 服务处于活跃(active)状态
- 1: 服务处于非活跃(inactive)状态
- 2: 服务启动失败(failed)
- 3: 服务未知(unknown)—— 通常是服务名称拼写错误/服务未安装,或是当前用户无权限查询服务状态
陷阱触发逻辑
你设置的trap 'catch $? $LINENO' ERR会捕获所有以非0状态退出的命令(除非命令是if/while等条件判断的一部分)。而STATUS="$(systemctl is-active $service)"(第19行)执行时,如果返回退出码3,就会触发ERR陷阱,直接终止脚本并抛出错误。额外脚本兼容性问题
你的脚本用#!/usr/bin/sh作为解释器,但SERVICES=(service1 service2 service3)是bash的数组扩展语法,POSIX标准的sh并不支持。这会导致SERVICES变量仅被赋值为service1,后续的service2和service3会被当作独立命令执行,可能引发其他潜在错误。
解决办法
- 排查服务状态
手动执行以下命令,确认每个服务的状态:
systemctl is-active service1 systemctl is-active service2 systemctl is-active service3
哪个命令返回非0,就对应哪个服务存在问题(不存在或权限不足)。
- 调整陷阱触发逻辑
如果不想让systemctl is-active的非0退出中断脚本,可以在命令后追加|| true,强制命令返回0:
STATUS="$(systemctl is-active $service || true)"
- 修正服务列表定义
若要兼容POSIX sh,改用空格分隔的字符串定义服务列表:
SERVICES="service1 service2 service3" for service in $SERVICES do # 原有逻辑不变 done
或者将脚本解释器改为bash(#!/usr/bin/bash),这样数组语法可以正常使用。
- 解决权限问题
如果是权限不足导致的错误,使用root权限执行脚本:
sudo sh start.sh
内容的提问来源于stack exchange,提问作者JPV
相关产品推荐
相关产品推荐

