Systemd Service 添加环境变量
背景
在 systemd 管理的服务中,进程不会继承用户 shell 的环境变量,需要通过 service 文件显式配置。
方式一:Environment 直接写入
在 [Service] 段中用 Environment 指令:
ini
[Service]
Environment="NODE_ENV=production"
Environment="API_KEY=abc123"
Environment="DB_HOST=localhost DB_PORT=5432" - 每行一个
Environment,或用空格分隔多个键值对 - 值有空格或特殊字符时必须加引号
适用场景:少量固定变量。
方式二:EnvironmentFile 引入外部文件
ini
[Service]
EnvironmentFile=/etc/myapp/env
# 文件不存在时不报错
EnvironmentFile=-/etc/myapp/env 外部文件 /etc/myapp/env 格式:
bash
NODE_ENV=production
API_KEY=abc123
DB_HOST=localhost - 不加
export,不加引号(除非值有空格) - 前缀
-表示文件不存在时不报错
适用场景:多变量、含敏感信息(文件权限设 600,仅 root 可读)、需区分环境(dev/staging/prod 用不同 env 文件)。
⚠️ 文件权限过宽会被拒绝加载
systemd 会检查 env 文件权限,如果对 other 可写(即权限包含 o+w,如 777、766、666 等),会报错并跳过该文件:
Permission denied while opening environment file: /etc/myapp/env 或:
/etc/myapp/env has unsafe permissions, ignoring. 这是安全机制——防止其他用户篡改 env 文件注入恶意环境变量。
正确权限:
bash
sudo chmod 600 /etc/myapp/env # 仅 root 可读写
sudo chmod 640 /etc/myapp/env # root 读写,组可读 方式三:PassEnvironment 传递系统变量
ini
[Service]
PassEnvironment=HTTP_PROXY HTTPS_PROXY 将 systemd 进程本身的环境变量传递给服务。
适用场景:需要继承 systemd 管理的全局代理等配置。
修改后必须执行
bash
sudo systemctl daemon-reload
sudo systemctl restart your-service 不 reload 修改不会生效。
选型建议
| 场景 | 推荐方式 |
|---|---|
| 少量固定变量 | Environment |
| 多变量 / 含敏感信息 | EnvironmentFile(权限 600) |
| 区分环境 | EnvironmentFile(不同 env 文件) |
| 继承系统代理等全局变量 | PassEnvironment |