You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bash脚本启动Systemctl服务时出现exit status 3错误的原因

错误原因分析与解决办法

错误原因

  1. systemctl is-active 退出码含义
    systemctl is-active命令的退出码对应服务的不同状态:
  • 0: 服务处于活跃(active)状态
  • 1: 服务处于非活跃(inactive)状态
  • 2: 服务启动失败(failed)
  • 3: 服务未知(unknown)—— 通常是服务名称拼写错误/服务未安装,或是当前用户无权限查询服务状态
  1. 陷阱触发逻辑
    你设置的trap 'catch $? $LINENO' ERR会捕获所有以非0状态退出的命令(除非命令是if/while等条件判断的一部分)。而STATUS="$(systemctl is-active $service)"(第19行)执行时,如果返回退出码3,就会触发ERR陷阱,直接终止脚本并抛出错误。

  2. 额外脚本兼容性问题
    你的脚本用#!/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:42:22