systemd服务中环境变量必须显式声明在service文件里:用environment=逐个设置或environmentfile=加载外部文件,需注意空格、引号和path等关键变量;修改后须daemon-reload并重启服务验证。

在 systemd 服务中配置环境变量,不能依赖 shell 配置文件(如 /etc/profile 或 ~/.bashrc),因为 systemd 启动的服务运行在独立会话中,不加载用户或系统 shell 环境。所有变量必须显式声明在 service 文件里。
直接在 [Service] 段用 Environment= 设置单个变量
这是最常用、最清晰的方式。每行一个键值对,等号两侧不能有空格,值含空格需加双引号:
Environment="APP_ENV=production"Environment="PORT=8080"Environment="LOG_LEVEL=debug"
多个变量可重复写多行 Environment=,systemd 会自动合并。
用 EnvironmentFile= 批量加载变量
适合变量较多、需复用或由运维统一管理的场景。指定一个纯文本文件,格式为每行 KEY=value,支持 # 注释和空行:
- 在 service 文件中添加:
EnvironmentFile=/etc/myapp/env - 该文件内容示例:
DB_HOST=localhost<br> DB_PORT=5432<br> SECRET_KEY="abc123 def456"
注意:文件路径必须存在且可读;权限建议设为 644,避免敏感信息泄露;变量值中的空格必须用双引号包裹,但等号前后不可有空格。
务必同时设置 PATH 和其他关键路径变量
systemd 默认的 PATH 极其有限(通常是 /usr/local/bin:/usr/bin:/bin),很多自定义命令或 Python 包会找不到。若服务启动脚本调用 python3、jq、curl 等,必须显式补全:
Environment="PATH=/usr/local/bin:/usr/bin:/bin:/opt/myapp/bin"- 如用 Python,还需补充:
Environment="PYTHONPATH=/opt/myapp/src"
漏掉 PATH 是导致 command not found 或 ModuleNotFoundError 的最常见原因。
验证是否生效
改完 service 文件后,必须执行:sudo systemctl daemon-reload
然后重启服务:sudo systemctl restart myapp.service
验证方式有两种:
- 查服务当前环境:
sudo systemctl show -p Environment myapp.service - 看程序实际运行时是否获取到变量:
journalctl -u myapp.service -o cat | grep -i env,或在应用代码中打印os.environ内容











