必须在[service]段显式配置workingdirectory和environment,systemd不继承shell环境;workingdirectory需绝对路径且存在、有rx权限;environment变量须明确定义,支持environmentfile批量加载;配置后需daemon-reload并验证。

必须在 [Service] 段里显式配置 WorkingDirectory 和 Environment,systemd 不会自动继承 shell 环境或脚本所在路径,不设就会出错。
工作目录(WorkingDirectory)必须指定绝对路径
systemd 默认以根目录 / 为工作目录,不是服务文件位置,也不是用户家目录。程序若用相对路径读配置、写日志或加载资源,不设就报 “No such file or directory”。
- 在
[Service]中添加:WorkingDirectory=/opt/myapp - 路径必须真实存在,且运行用户对该目录有
r-x权限(可读、可进入) - 推荐用绝对路径,避免符号链接歧义;含空格或特殊字符也不需加引号
环境变量要明确定义,不能靠 shell 继承
systemd 启动时环境极简,$PATH、$HOME 等都不自动可用。所有变量必须写死或通过文件加载。
- 单个或多个变量:每行一个
Environment=KEY=value,例如Environment=APP_ENV=productionEnvironment=PATH=/usr/local/bin:/usr/bin:/bin - 批量管理:用
EnvironmentFile=/etc/myapp/env,文件内容为每行KEY=value,支持#注释和空行 - 变量值含空格必须用双引号包裹,如
Environment="LOG_DIR=/var/log/my app";等号两侧不能有空格
常见错误与验证方法
配置后不生效?大概率卡在这几个地方:
- 改完服务文件没执行
sudo systemctl daemon-reload—— 这步必不可少 -
ExecStart用了./app.py这类相对路径,但WorkingDirectory没配对 - 环境变量名大小写不一致,比如代码里读
PYTHONPATH,配置写成了pythonpath - 误以为能用
$HOME或$(pwd),systemd 不解析这些 shell 表达式
验证是否生效:
启动服务后运行 sudo systemctl show -p Environment,WorkingDirectory myapp.service,或查日志 journalctl -u myapp.service -o cat 看程序是否拿到预期值。











