workingdirectory和environment必须显式配置:workingdirectory需设为项目根目录(如/opt/myapp),确保相对路径有效;environment至少包含path和pythonpath等关键变量,避免modulenotfounderror或文件路径错误。

配置 systemd 服务的环境变量和工作目录很关键,直接影响程序能否正常读取配置、加载依赖或写入日志。这两项不是可选项,而是实际部署中容易出错的高频点。
工作目录(WorkingDirectory)必须显式指定
systemd 启动服务时默认工作目录是根目录 /,不是脚本所在路径,也不是用户家目录。如果程序依赖相对路径读取配置文件、模板或数据,不设 WorkingDirectory 就会报 “No such file or directory” 错误。
- 在
[Service]段中添加:WorkingDirectory=/opt/myapp - 路径必须存在,且运行用户对该目录有读、执行(进入)权限
- 建议用绝对路径,避免符号链接歧义;若路径含空格或特殊字符,无需引号,systemd 原生支持
环境变量有三种设置方式,按需选用
环境变量用于传递数据库地址、密钥、运行模式等参数。systemd 不继承 shell 的环境,所有变量必须在服务文件中明确定义。
-
单个变量:用
Environment=KEY=value,例如:Environment="APP_ENV=production" "PORT=8080" -
多个变量:可重复写多行
Environment,每行一个键值对 -
批量加载:用
EnvironmentFile=/etc/myapp/env,文件格式为KEY=value每行一条,支持#注释和空行
注意:EnvironmentFile 路径必须可读,且文件权限不宜过于宽松(如不应是 777);变量值中含空格需用双引号包裹,但等号两侧不能有空格。
常见陷阱与验证方法
配置后不生效?多半卡在这几个地方:
- 改完服务文件没执行
sudo systemctl daemon-reload—— 这步必不可少 -
ExecStart中用了相对路径(比如./app.py),而WorkingDirectory又没设对 - 环境变量名拼写错误,或大小写不一致(如
app_env和代码里期望的APP_ENV) - 想用
$HOME或$PATH等 shell 变量?systemd 不解析它们,必须写死或用Environment=PATH=/usr/local/bin:/usr/bin
验证是否生效:启动服务后运行 sudo systemctl show -p Environment,WorkingDirectory myapp.service,或查日志 journalctl -u myapp.service -o cat 看程序是否打印出预期变量值。











