Skip to content

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

基于 VitePress 构建