首页/系统/信创系统运维速查/服务环境变量:EnvironmentFile 配置
服务与运维65 条

服务环境变量:EnvironmentFile 配置

给 systemd 服务集中注入环境变量:单元里用 EnvironmentFile 指向 key=value 文件(路径前加 - 表示文件缺失也不报错),配合 Environment 直接定义,改后重启生效。

信创系统运维速查系统更新于 2026-10-13

EnvironmentFile 是什么

systemd 服务默认不继承登录 shell 的环境变量,程序需要的路径、端口、连接地址要通过单元里的 Environment 或 EnvironmentFile 注入。Environment 直接在单元里写键值,EnvironmentFile 则指向一个纯文本 KEY=value 文件,把变量与单元解耦。生产上多把环境文件放在 /etc/sysconfig/ 下,按环境维护多份,改内容只需重启服务,不必动单元文件。

基本信息

适用平台systemd 系 Linux:openEuler、麒麟、UOS、RHEL 8/9
语法EnvironmentFile=/绝对路径,路径前加 - 表示文件不存在也不报错
文件格式每行 KEY=value,不写 export,不做命令替换
修改生效改环境文件内容 restart 即可;改单元里的指向路径要 daemon-reload
常见目录/etc/sysconfig/、/etc/default/

典型使用场景

  • 应用配置外置:把数据库地址、端口、日志级别放在环境文件里,多环境用不同文件切换
  • 避免密钥入库:口令类变量集中在权限受限的文件里,单元文件可安全提交到版本库
  • 迁移适配:从老 SysV 脚本迁到 systemd 时,把原来的 /etc/sysconfig 内容原样接过来
  • 统一运维口径:运维只改环境文件并重启,不用去碰单元定义,降低改错风险
  • 灰度对照:同二进制跑两组服务,用不同 EnvironmentFile 区分参数

单元片段

单元片段
[Unit]
Description=My App
After=network-online.target

[Service]
EnvironmentFile=-/etc/sysconfig/myapp
Environment=APP_MODE=prod
ExecStart=/opt/myapp/bin/myapp
Restart=on-failure

[Install]
WantedBy=multi-user.target

环境文件与生效确认

环境文件与生效确认
# /etc/sysconfig/myapp(不要写 export)
PORT=8080
DB_HOST=10.0.0.30
LOG_LEVEL=info

# 生效与确认
chmod 600 /etc/sysconfig/myapp
systemctl daemon-reload && systemctl restart myapp
systemctl show myapp -p EnvironmentFile -p Environment   # 看变量是否被读入
systemctl show myapp -p ExecMainStatus                   # 服务是否正常退出/运行

语法要点对照

写法结果说明
KEY=value正常注入值是裸值,不要加引号
export KEY=value变量名会被当成 exportsystemd 不解析 shell 语法
KEY=/path with space空格后内容被忽略或报错含空格的值要整体加双引号
KEY=$(date)原样传入字面量systemd 不做命令替换
-/etc/sysconfig/app文件缺失不报错适合可选配置文件
多行 EnvironmentFile后者覆盖前者同名键按序加载,注意优先级
Environment 与 EnvironmentFile 同时存在且变量同名时后者生效;需要临时覆盖某个值可以在单元里用 EnvironmentFile 后再跟一行 Environment,但那会影响所有实例。
环境文件里常放数据库口令,权限至少设为 600 且属主为该服务用户;放进 /etc/sysconfig 后注意不要被其他包的权限策略改宽。

易错点

  • 环境文件里写了 export 或 $(...) 命令替换,systemd 不会当 shell 解析,变量值会变成字面量导致程序读错配置。
  • 改了环境文件里的值只重启服务即可,但如果改了单元里 EnvironmentFile 的路径,必须先 daemon-reload 才生效。
  • 值里带多余空格与引号会被原样带入,连接串多一个空格就可能连不上库,保持裸值写法更稳。
  • 把变量写在 /etc/profile 里期望服务读不到——服务不走登录 shell,这类环境变量对它完全无效。
  • 环境文件权限过宽会让口令类信息可被其他用户读取,安全核查中属于高风险项。

数据来源与参考

  • man 5 systemd.exec(EnvironmentFile)
  • 红帽系统管理指南(服务环境变量)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌