Watch at Ease看见世界,读懂生活。

科技 · 实用指南

systemd 报 status=203/EXEC?先证明可执行文件、解释器和服务上下文

命令能在交互式 shell 中运行,不代表服务进程能启动。先保存 journal,检查实际生效的 ExecStart,再按服务上下文核对可执行路径、shebang 解释器、目录遍历、挂载选项和策略证据。

原创技术图:从生效 ExecStart 经文件路径、shebang 解释器和服务上下文追到 ENOENT、EACCES 或 ENOEXEC。
原创示意图:选修复前先保留 execve 失败类别。 Watch at Ease

status=203/EXEC 表示 systemd 已走到执行配置程序的步骤,但 execve 并未启动该程序。登录 shell 成功,服务仍可能因为可执行项、工作目录、用户、挂载视图或安全上下文不同而失败。

不要从 chmod 777、添加 shell 包装或关闭安全策略开始。先保存第一份 journal 证据,读取合并后的 unit,再分类失败的可执行文件或解释器路径,只做一次窄修复。

先冻结第一次执行证据

保存 systemctl status 和第一批相关 journal,避免反复重启淹没原始信息。记录系统还是 --user unit、精确名称、boot、时间和 203/EXEC 行。

用 systemctl cat 保存基础 unit 与全部 drop-in,再用 systemctl show 查看 ExecStart、User、Group 和 WorkingDirectory。把合并后的命令与 shell 中成功的命令比较。

解析可执行文件和每段路径

从实际 ExecStart 取第一个可执行项,解析符号链接,用 file 检查目标,并用 namei -l 等工具查看每个父目录的搜索权限;不要扩大无关权限。

目标是脚本时按字节读取首行,确认 shebang 解释器在精确绝对路径存在,且行尾没有隐藏的回车。缺少解释器时,即使脚本存在也会得到 ENOENT。

测试服务上下文而不是只测 shell

按配置用户和工作目录重现查找,但把 sudo -u 视为部分测试:实际 unit 还可能改变环境、命名空间、能力与文件系统可见性。优先相信真实 unit 和 journal 证据。

对程序和解释器都用 findmnt -T 检查 noexec 等挂载选项。普通路径和权限通过后,再查看近期 audit AVC 与 systemd journal,不要用关闭强制策略来掩盖症状。

只修已经证明的边界

修正错误 ExecStart、安装指定解释器、修复 shebang 或行尾,或授予最小的文件与目录访问。位于 noexec 路径时,移到批准的可执行位置,或由文件系统所有者确认挂载策略。

遇到 SELinux 拒绝先核对标签和标准位置,再按平台指引分析;不要直接切全局 permissive,也不要在不理解对象来源时生成宽泛允许规则。

只重载必要内容,再观察一次启动

仅在 unit 或 drop-in 改变时运行 daemon-reload。启动一次后立即查看 status 与新 journal,避免自动重试掩盖边界是否仍然相同。

启动成功后还要确认预期主 PID、子进程和工作目录,并执行一个真实请求或任务;保存最终生效 unit 与窄修改,便于以后比较。

原创技术图:systemd 203/EXEC 的 unit、路径、解释器、服务上下文、窄修复与单次重试顺序。
原创示意图:chmod 或策略修改前先验证 unit 与服务上下文。 Watch at Ease