systemd 服务状态 203 ——从未执行过的 exec
systemd 服务状态 203 意味着程序从未运行。三种错误退出结果完全相同——日志的第二行会点出你的那一种。实测,附解法。
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,从来不在动词。
Permission denied:缺的就是那个位#!/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 directory | ExecStart 路径本身 | 改正路径——绝对路径,不要笔误 |
| Unable to locate executable … Permission denied | 执行位 | sudo chmod +x /path/to/script |
| Failed to execute … No such file or directory | shebang 里的解释器 | 修好第 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
一个号码,三道门,一本每次都点名那道门的日志。先读第二行,再动手重启任何东西。■