开机启动脚本报错多因systemd未加载用户环境变量,需通过cat /proc/PID/environ确认缺失项,在service文件[Service]段硬编码Environment指定PATH、PYTHONPATH、HOME等,并用绝对路径写ExecStart命令,最后daemon-reload并验证。

开机启动脚本报错“command not found”“No module named xxx”或“libxxx.so: cannot open”,十有八九不是脚本本身有问题,而是它运行时压根没拿到该有的环境变量——PATH、PYTHONPATH、LD_LIBRARY_PATH、HOME 等全被重置为极简状态。systemd 不读 ~/.bashrc,不加载 /etc/profile,它的执行环境干净得像刚出厂的机器。
先确认是不是环境变量真丢了
别猜,直接看进程在用什么环境:
- 查服务当前 PID:systemctl show --property=MainPID your-service.service | cut -d= -f2
- 读取该进程实际环境:cat /proc/
/environ | tr '\0' '\n' (把 \0 换成换行,才看得清) - 手动执行同一命令,再跑 env | grep -E "(PATH|HOME|PYTHONPATH)",两份输出逐行对比
重点盯死 PATH 和解释器路径
PATH 缺失是最常见原因,但很多人只补 PATH,却忘了 ExecStart 里调用的命令本身也得是绝对路径:
评估聊天、邮件、电话、社交平台私信(DM)或电商平台客服团队的服务质量。适用于团队需要制定 QA 评分卡、故障模式分析、辅导计划、校准检查清单或服务改进简报,但无法访问实时工单系统、CRM 或联络中心系统的情况。
- ExecStart 不能写 python3 app.py,得写 /usr/bin/python3 /opt/myapp/app.py(用 which python3 确认真实路径)
- 脚本里调用的其他命令(如 jq、curl、自定义二进制)也必须用绝对路径,或确保 PATH 已包含其所在目录
- 如果用了 User=test,那 test 用户的默认 PATH 通常不含 /usr/local/bin,必须显式补全
在 service 文件里硬编码环境变量
这是最稳、最透明的做法,别依赖外部配置文件:
- 编辑 /etc/systemd/system/your-service.service
- 在 [Service] 段加:
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONPATH=/opt/myapp/lib"
Environment="HOME=/home/test" - 改完立刻执行:sudo systemctl daemon-reload && sudo systemctl restart your-service.service
验证是否生效,别跳过这步
重启服务后马上检查:
- systemctl status your-service.service —— 看有没有 early exit 或 failed 提示
- journalctl -u your-service.service -n 30 -o cat —— 搜 command not found 或 cannot open shared object file
- 再跑一次 cat /proc/
/environ | tr '\0' '\n' | grep -E "(PATH|HOME)" ,确认你设的值真出现在里面

















