答案是路径解析、权限、环境、依赖四层问题导致systemd无法执行二进制。需用systemctl show和cat确认ExecStart绝对路径,ls -l查存在性与权限,ldd查动态库,shebang用绝对路径,Environment设PATH,readlink查真实进程路径。

服务启动时报“找不到执行程序”或“Exec format error”“No such file or directory”,本质是 systemd 在启动时无法定位、访问或加载 ExecStart 指定的二进制路径。这不是简单的“命令没装”,而是路径解析、权限、环境、依赖四层环节出了问题。排查要从 systemd 的视角出发,而不是你的终端视角。
查清 systemd 实际要执行的路径
不要凭印象或 which 命令猜路径。systemd 严格按 Unit 文件里 ExecStart= 写的值执行:
- 运行 systemctl show --property=ExecStart 服务名.service,直接看到它准备调用的完整命令行
- 再用 systemctl cat 服务名.service 查看整个 Unit 文件,确认 ExecStart 是绝对路径还是相对路径(相对路径会以 root 根目录为基准,不是你当前 shell 的 pwd)
- 如果看到类似
ExecStart=/usr/bin/myapp,就立刻检查这个路径是否存在:ls -l /usr/bin/myapp
验证文件存在性、可执行性与动态依赖
即使文件存在,也可能因权限或链接失效而无法运行:
- 确认文件有可执行权限:ls -l /usr/bin/myapp → 第一列应含
x(如-rwxr-xr-x) - 如果是 ELF 二进制(非脚本),运行 ldd /usr/bin/myapp | grep "not found",缺失的共享库会导致“Exec format error”
- 若文件是脚本(如 Python/Shell),检查首行 shebang 是否正确且解释器存在,例如
#!/usr/bin/env python3要求env和python3都在 PATH 中——但注意:systemd 默认 PATH 极简,/usr/bin/env可能不存在,建议改用绝对路径#!/usr/bin/python3
检查环境变量与 PATH 差异
你在终端能 run 的命令,在 systemd 里很可能找不到,因为它的 PATH 默认只有 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
- 查看服务实际使用的 PATH:systemctl show --property=Environment 服务名.service,若为空,则走默认值
- 临时加 PATH:在 Unit 文件 [Service] 段添加 Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/myapp/bin"
- 更稳妥做法:所有 ExecStart 中的命令都写绝对路径,避免任何 PATH 依赖
确认进程真实启动上下文
有时服务看似启动了,但跑的是别的程序(比如旧版本、软链接目标已删、或被容器覆盖):
- 查正在运行的进程真实路径:pgrep -f myapp | xargs -r -I{} readlink -f /proc/{}/exe
- 对比 /proc/PID/cmdline:cat /proc/$(pgrep -f myapp)/cmdline | tr '\0' ' ',看它到底执行了哪条命令
- 若发现 exe 指向
(deleted),说明二进制已被删但进程仍在运行;若 cmdline 显示的是解释器(如/bin/bash),那真正逻辑在脚本里,需继续查脚本路径和内容


















