systemctl edit
systemctl edit 打开的不是原始单元文件,而是 /etc/systemd/system/<单元名>.d/override.conf 这个 drop-in 覆盖文件。systemd 在加载单元时会把主文件与所有 drop-in 合并,/etc 下的内容优先级最高。这样做的好处是:软件包升级替换掉 /usr/lib 下的上游单元,你的定制依然保留;查看最终生效结果用 systemctl cat 就能同时看到所有层。
基本信息
| 用途 | 为已存在的单元添加 drop-in 覆盖配置,不修改上游文件 |
|---|---|
| 语法 | systemctl edit [--full] 单元;--full 打开整份副本供大改 |
| 所属 | systemd |
| 生效步骤 | 保存后 systemctl daemon-reload,再 restart 让单元重新读取配置 |
典型使用场景
- 调整启动参数:给服务补一个 Environment 或改 ExecStart 的环境变量
- 加资源限制:为某个服务单独设定 LimitNOFILE、MemoryMax
- 改重启策略:给关键服务设置 Restart=always 与 RestartSec
- 临时排障:加一个 Environment 打开调试开关,排完再删掉覆盖文件
- 包升级保全:上游单元被替换后,定制项依旧生效,不必重新打补丁
常用示例
常用示例
systemctl edit myapp # 编辑 /etc/systemd/system/myapp.service.d/override.conf
# 文件内容示例:
# [Service]
# Environment=JAVA_OPTS=-Xmx2g
# Restart=always
systemctl daemon-reload && systemctl restart myapp
systemctl cat myapp # 查看合并后的最终配置覆盖列表型指令要清空
覆盖列表型指令要清空
# ExecStart/Environment 属于「列表型」指令,直接追加会变成两条
[Service]
ExecStart=
ExecStart=/opt/app/bin/app --config /etc/app/app.conf
Environment=
Environment=JAVA_OPTS=-Xmx2g
# 清理覆盖:ls /etc/systemd/system/myapp.service.d/ 然后删掉对应文件单元配置的优先级顺序
| 路径 | 谁在写 | 优先级 |
|---|---|---|
| /usr/lib/systemd/system/ | 发行版与软件包 | 最低,升级会被覆盖 |
| /run/systemd/system/ | 运行时临时生成 | 中,重启即消失,适合临时排障 |
| /etc/systemd/system/ | 管理员 | 最高,同名单元、drop-in 都优先这里 |
drop-in 目录名必须是完整单元名加 .d(例如 myapp.service.d)。systemctl edit 会自动创建,手工创建时别写成 myapp.d,否则 systemd 根本不加载。
用 --full 编辑的是整份副本,会与上游文件脱钩:上游新增的依赖或安全加固不会自动继承过来。只有确实要大改时才用它。
改动落盘位置对照
| 位置 | 作用 | 注意 |
|---|---|---|
| 单元片段目录 | 覆盖式追加配置 | 推荐做法,升级不丢失 |
| 系统级自定义单元 | 整体替换上游定义 | 改动大时才这么做 |
| 发行版提供的上游文件 | 不要直接修改 | 升级会被覆盖 |
| 模板实例的片段 | 只影响该实例 | 路径需带实例名 |
清空列表型指令时先写一行同名空值再补新值,否则新旧内容会叠加执行;改完统一重载一次,确认单元读到的最终配置符合预期,再重启服务验证。排障期间加的临时覆盖要写清原因与期限,防止长期留在配置里变成谁也说不清的隐性参数。