绝对路径是systemd开机自启的硬性要求,因systemd无默认工作目录、不展开~、不继承shell环境,execstart等所有路径必须为绝对路径,否则报“no such file or directory”。

开机自启程序报“找不到文件”,90%不是脚本真丢了,而是运行时的路径、环境或权限和你手动执行时完全不同。关键不是找文件在哪,而是搞清“谁在什么上下文里找、往哪找”。
确认脚本路径是否全用绝对路径
systemd 启动服务时没有默认工作目录,也不会继承你的 shell PATH 或家目录。相对路径(如 ./start.sh、python main.py)几乎必失败。
- ExecStart 必须写完整路径:/usr/bin/python3 /home/user/project/app.py
- Python 解释器别写 python,要写 /usr/bin/python3(可用 which python3 确认)
- 脚本自身也要用绝对路径调用其他命令,比如 /bin/bash /opt/myscript.sh,不能只写 myscript.sh
检查脚本和依赖文件的权限与归属
systemd 默认以 root 运行,但如果你指定了 User=test,那它就以 test 用户身份执行——而该用户必须有权限读取脚本、解释器、配置文件、日志目录等所有涉及路径。
- 给脚本加可执行权限:sudo chmod +x /home/user/startup.sh
- 确认脚本归属正确:sudo chown test:test /home/user/startup.sh
- 如果脚本要写日志到 /home/test/logs/,确保该目录存在且 test 用户有写权限
验证 systemd 是否加载了服务并识别路径
别跳过基础检查。很多“找不到文件”其实是服务压根没被 systemd 读进去。
- 确认服务文件位置和后缀:ls /etc/systemd/system/*.service | grep yourname
- 重载配置再启用:sudo systemctl daemon-reload && sudo systemctl enable yourname.service
- 查是否已加载成功:systemctl list-unit-files | grep yourname → 应显示 enabled
看真实日志,定位具体哪一行报错
错误信息里“找不到文件”的对象,才是你要找的目标。可能是脚本、解释器、配置文件,甚至某个 .so 库。
- 立即查状态:systemctl status yourname.service(重点看最后一行 Failed 提示)
- 翻完整日志:journalctl -u yourname.service -n 50 -o cat
- 常见线索举例:
→ Failed at step EXEC spawning /xxx/script.sh: No such file or directory:脚本路径错或没 x 权限
→ Failed at step EXEC spawning python: No such file or directory:PATH 太简陋,没找到 python,必须写全路径
→ Cannot open config file '/etc/myapp/conf.ini': No such file:配置文件路径硬编码错了











