SYSTEMD · 2026-11-12

systemd 服务状态 203 ——从未执行过的 exec

systemd 服务状态 203 意味着程序从未运行。三种错误退出结果完全相同——日志的第二行会点出你的那一种。实测,附解法。

HUMAN作者 @mrkeepalive14h3 分钟读完
单元文件ExecStart=… 门 1 · 定位对路径做 stat 门 2 · execve路径 + 执行位 门 3shebang 你的程序终于跑起来了——这一切都不怪它 A 死在门 1 · No such file or directoryB 死在门 2 · Permission denied —— C 死在门 3 · No such file or directory(解释器)
图 1 —— exec 接力。status=203/EXEC 就是接力棒在门 1、2 或 3 掉落;最下面那个框从未启动。

状态 203/EXEC 到底是什么意思?

先记住这句话:status=203/EXEC 是 systemd 在报告:你的 ExecStart 命令的 execve 在生成进程时就失败了——你的进程从未存在过,所以程序的逻辑、配置、代码此刻都还不沾边。在实测机上,一个用完即弃的 oneshot 单元轮流戴上每种故障,每次都打出同一份判决:

$ systemctl show bench203.service -p ExecMainCode -p ExecMainStatus -p Result
ExecMainCode=1
ExecMainStatus=203
Result=exit-code

验证:ExecMainCode=1 即 CLD_EXITED,203 是 exec 家族的退出状态;同一单元治好后读到 ExecMainStatus=0 和 Result=success(回执见下)。

三种不同的错误,一个号码

三个 ExecStart 值,同一次开机里的三次启动,相隔几秒。systemctl status——大多数人真正会看的那块屏——没能把它们区分开:

Process: 703 ExecStart=/opt/bench203/no-such-binary (code=exited, status=203/EXEC)
Process: 778 ExecStart=/opt/bench203/worker.sh      (code=exited, status=203/EXEC)   # file exists, mode 0644
Process: 853 ExecStart=/opt/bench203/shebang.sh     (code=exited, status=203/EXEC)   # +x, interpreter missing

验证:三次启动,三个一模一样的 status=203/EXEC 结尾——状态屏只告诉你“出了什么”,从不告诉你“是哪一种”。

民间偏方是重装程序,或者把单元放进重启循环。重启循环正是这里的谎言:程序从来就不是病人。日志条目的第二行——Starting… 底下的那一行——才是诊断,而且三次各不相同:

bench203.service: Unable to locate executable '/opt/bench203/no-such-binary': No such file or directory
bench203.service: Unable to locate executable '/opt/bench203/worker.sh': Permission denied
bench203.service: Failed to execute /opt/bench203/shebang.sh: No such file or directory

验证:逐字摘自 journalctl -u bench203.service,每种故障一行,PID 分别为 703 / 778 / 853。

三种之中,你的是哪一种?

分两步读第二行。先看第一组词:Unable to locate executable 说的是你的路径(故障 A 或 B);Failed to execute 说明 systemd 已经过了你的文件,丢的是它点名的东西——第 1 行的解释器(故障 C)。再看冒号后的 errno:No such file or directory 还是 Permission denied,把 A 和 B 分开。

故障 B 的措辞值得单独警告:Unable to locate executable … Permission denied 指控文件不存在,而文件就好好待在那里——28 字节,权限 0644,与世无争。systemd 其实找到了它;只是这句话里说不出口。真相在 errno,从来不在动词。

A路径写错——Unable to locate … No such file or directory:文件真的不在
B没有执行位——同样的 Unable to locate 措辞,errno 为 Permission denied:缺的就是那个位
Cshebang 损坏——Failed to execute … No such file or directory:你的文件没问题,#!/usr/bin/bashh 有问题

状态 203/EXEC 怎么修?

实测中的解法:给 B 的形态一个 chmod,给 C 的形态一行诚实的第 1 行——不重装,不循环重启:

sudo chmod 0755 /opt/bench203/worker.sh        # give back the exec bit
# and make line 1 of the script name a real interpreter:
#!/bin/bash
$ systemctl show bench203.service -p ExecMainStatus -p Result
ExecMainStatus=0
Result=success

验证:治好后的那次运行,日志依次读到 worker.sh[931]: worker ran → Deactivated successfully. → Finished bench203 fault shapes.——oneshot 干完活就走了。

九月的systemd 服务无法启动:日志早已点名原因为一个更安静的错误许下过同样的承诺。203 是这条定律最响亮的版本——你还没打开单元文件,供词已经落进日志。

解法,按顺序

三份供词,一眼看清

日志说缺什么解法
Unable to locate executable … No such file or directoryExecStart 路径本身改正路径——绝对路径,不要笔误
Unable to locate executable … Permission denied执行位sudo chmod +x /path/to/script
Failed to execute … No such file or directoryshebang 里的解释器修好第 1 行(#!/bin/bash)或安装解释器
“203 不是你的程序死了——是 systemd 交不出钥匙。哪一把钥匙,日志每次都会点名。”
实测机没有覆盖的情况

实测内容:三种故障形态(路径不存在、权限 0644、shebang 损坏),一台全新 Arch VM,systemd 262 (262.1-1-arch),oneshot 单元,相隔几秒,外加治好后的那次运行。未实测:相对的 ExecStart 路径——systemd 在解析阶段就会用自己的报错拒绝它,不是 203(公开记录);SELinux/AppArmor 拒绝——它们同样以 Permission denied 这个 errno 浮出水面——怪执行位之前先查你的 LSM;chroot 下的 ExecStart 路径。一台机器、一个 build:可迁移的是读日志的规则;你自己的那行日志才是判决。

人工实测台架 · systemd 262 (262.1-1-arch) · 全新 Arch VM · 最后测试 2026-11-11

一个号码,三道门,一本每次都点名那道门的日志。先读第二行,再动手重启任何东西。■