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