systemd 单元文件存放路径是什么
systemd 加载单元文件时按目录优先级覆盖:管理员目录优先级最高,其次是运行期目录,最后是发行版包安装的目录。同名单元存在多个位置时,只有优先级最高的那份生效。理解这条规则的关键在于:要定制一个包自带的单元,不要直接改包安装目录下的文件,因为包升级会把它覆盖掉;正确做法是放到管理员目录下或使用覆盖目录。
基本信息
| 适用平台 | 使用 systemd 的 GNU/Linux |
|---|---|
| 优先级顺序 | /etc/systemd/system 高于 /run/systemd/system 高于 /usr/lib/systemd/system |
| 自建单元 | 放在 /etc/systemd/system 下最稳 |
| 包安装单元 | 位于 /usr/lib/systemd/system,不应直接修改 |
| 查生效文件 | systemctl show -p FragmentPath 单元名 |
| 改完动作 | 执行 systemctl daemon-reload 再重启服务 |
典型使用场景
- 确认某个服务最终使用的是哪个单元文件,排查改了却没生效。
- 新建自建服务单元,放到优先级最高且不会被升级覆盖的位置。
- 定制包自带服务的行为:先备份再覆盖,或改用覆盖目录。
- 梳理机器上同名单元的多份文件,弄清哪一份真正生效。
- 升级后服务行为变化时,排查是否被包管理器的单元覆盖。
常用写法
常用写法
ls -l /etc/systemd/system/ | head # 自建与覆盖的单元
ls /usr/lib/systemd/system/ | wc -l # 包安装的单元数量
systemctl show -p FragmentPath myapp # 查看实际生效的单元文件
systemctl cat myapp # 打印生效内容与全部覆盖片段
systemctl daemon-reload # 改完单元后重新加载
systemctl list-unit-files --state=enabled | head # 已启用的单元清单
find /etc/systemd /run/systemd /usr/lib/systemd -name 'nginx.service' # 同名单元分布路径与命令读法
| 路径或命令 | 含义 | 使用要点 |
|---|---|---|
| /etc/systemd/system | 管理员单元目录,优先级最高 | 自建与覆盖都放这里 |
| /run/systemd/system | 运行期生成,重启即消失 | 临时调试使用 |
| /usr/lib/systemd/system | 包管理器安装位置 | 不要直接改,升级会被覆盖 |
| show -p FragmentPath | 查询生效文件路径 | 判断哪个文件真正生效 |
| systemctl cat | 打印内容加覆盖片段 | 排障时一步看到全部叠加 |
| daemon-reload | 重新加载单元定义 | 改完必须执行才生效 |
判断哪个文件生效不要靠猜:查询实际生效的单元路径或直接打印单元内容,会连带显示所有叠加的覆盖片段,排查时最省时间。
想保留包自带单元并在其基础上定制,优先用覆盖目录而不是替换整个文件,这样包升级带来的一般性改进仍然会生效。
修改单元文件后必须重新加载才生效:只重启服务不会重新读取磁盘上的单元定义,验证前先确认已经加载过。