Linux中为systemd服务注入环境变量必须显式声明,推荐在服务文件[Service]段用Environment=或EnvironmentFile=加载,同时设置WorkingDirectory和PATH,并执行daemon-reload后重启验证。

在 Linux 系统中,为开机启动的服务注入环境变量,核心原则是:systemd 服务**不继承 shell 环境**,所有变量必须显式声明。直接改 /etc/profile 或用户 .bashrc 对服务完全无效。
在 systemd 服务文件中直接定义
这是最推荐、最清晰、最可控的方式,适用于绝大多数自定义服务。
- 编辑服务单元文件,例如
/etc/systemd/system/myapp.service - 在
[Service]段内添加Environment=行,每行一个变量,等号两侧不能有空格:Environment="APP_ENV=production"Environment="PORT=8000"Environment="PATH=/usr/local/bin:/usr/bin:/bin" - 若变量值含空格或特殊字符,必须用双引号包裹整个
KEY=value,如Environment="LOG_DIR=/var/log/my app" - 需要多个变量时,可重复写多行
Environment=,也可合并为一行(用空格分隔):Environment="A=1" "B=2" "C=3"
使用 EnvironmentFile 加载外部配置
适合变量较多、需集中管理或配合配置部署流程的场景。
- 新建纯文本文件,如
/etc/myapp/env,格式为每行KEY=value,支持#注释和空行:DB_HOST=localhostDB_PORT=5432# This is a comment - 确保该文件存在且运行服务的用户有读取权限(如
644),路径不能是777 - 在服务文件中引用:
EnvironmentFile=/etc/myapp/env - 注意:
/etc/environment是系统级初始化文件,systemd 默认不读它;不要混淆
显式设置 WorkingDirectory 和 PATH
这两个不是“环境变量”本身,但直接影响程序能否正常运行,常被忽略。
-
WorkingDirectory必须设为项目根目录(如/opt/myapp),否则相对路径(如./config.yaml)会失败 -
PATH必须显式包含所需命令路径,例如/usr/local/bin,否则ExecStart中调用的命令会报command not found - 示例:
WorkingDirectory=/opt/myappEnvironment="PATH=/usr/local/bin:/usr/bin:/bin"
验证与排错
配置后务必验证,避免“以为生效了”却出错。
- 修改服务文件后,必须执行:
sudo systemctl daemon-reload - 重启服务:
sudo systemctl restart myapp.service - 查看服务实际加载的变量和工作目录:
sudo systemctl show -p Environment,WorkingDirectory myapp.service - 检查程序日志是否读取到预期值:
journalctl -u myapp.service -o cat | grep -i env - 常见失效原因:没 reload、
WorkingDirectory路径不存在或无权限、变量名大小写不一致、ExecStart写了./script.sh却没设工作目录


















