本文记录在 Ubuntu / Linux 系统中使用 systemd + systemctl 管理系统服务时的常见目录结构、.service 文件位置以及 .service.d 目录的作用。
1. systemd 简介
现代 Linux 发行版(如 Ubuntu、Debian、CentOS 等)大多使用 systemd 作为系统初始化与服务管理系统。
常见管理命令:
-
systemctl start xxx启动服务 -
systemctl stop xxx停止服务 -
systemctl restart xxx重启服务 -
systemctl status xxx查看服务状态 -
systemctl enable xxx设置开机启动 -
systemctl disable xxx取消开机启动
2. .service 文件位置
在 systemd 中,一个服务通常由一个 .service 文件定义。
不同来源的服务文件会放在不同目录。
2.1 系统或软件包自带服务
通常由 apt / yum 等包管理器安装。
常见位置:
/lib/systemd/system/
/usr/lib/systemd/system/
特点:
-
由系统或软件包提供
-
软件升级时可能被覆盖
-
不建议直接修改
例如:
/lib/systemd/system/nginx.service
/lib/systemd/system/docker.service
2.2 管理员自定义服务
管理员自己创建的服务应放在:
/etc/systemd/system/
例如:
/etc/systemd/system/myapp.service
特点:
-
用户自定义
-
优先级高于 /lib/systemd/system
-
不会被软件升级覆盖
3. xxx.service.d 目录的作用
当需要 修改已有服务配置 ,但又不想直接修改原 .service 文件时,可以使用:
xxx.service.d/
示例:
/etc/systemd/system/nginx.service.d/
在该目录中可以放置额外配置文件,例如:
/etc/systemd/system/nginx.service.d/override.conf
示例内容:
[Service]
Restart=always
RestartSec=5
systemd 在加载服务时会:
-
读取原始
.service -
再读取
.service.d/*.conf -
合并配置
因此 .service.d 可以理解为:
补丁配置 / 覆盖配置
优点:
-
不修改原文件
-
软件升级不会覆盖
-
只修改需要调整的部分
4. 什么时候使用 .service.d
情况一:创建新服务
直接创建 .service 文件。
例如:
/etc/systemd/system/myapp.service
情况二:修改已有服务
不要修改:
/lib/systemd/system/docker.service
而是创建:
/etc/systemd/system/docker.service.d/override.conf
例如:
[Service]
Restart=always
5. systemd 配置优先级
systemd 加载服务时优先级大致如下:
/etc/systemd/system (管理员配置,优先级最高)
/run/systemd/system (运行时配置)
/lib/systemd/system
/usr/lib/systemd/system (系统默认服务)
因此:
/etc/systemd/system > /lib/systemd/system
6. 创建一个自定义服务示例
创建服务文件:
sudo nano /etc/systemd/system/myapp.service
内容示例:
[Unit]
Description=My Java Application
After=network.target
[Service]
User=root
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
7. 重新加载 systemd
修改或新增服务后需要刷新 systemd:
sudo systemctl daemon-reload
8. 常用管理命令
启动服务:
sudo systemctl start myapp
停止服务:
sudo systemctl stop myapp
查看状态:
sudo systemctl status myapp
设置开机启动:
sudo systemctl enable myapp
取消开机启动:
sudo systemctl disable myapp
9. 查看最终合并配置
systemd 可以查看完整服务配置:
systemctl cat myapp
输出会显示:
-
主
.service文件 -
.service.d/*.conf覆盖配置
方便排查配置来源。
10. 快速记忆总结
可以这样理解 systemd 服务结构:
.service = 主配置文件
.service.d/*.conf = 覆盖 / 补丁配置
目录含义:
/lib/systemd/system/ 系统或软件包自带服务
/etc/systemd/system/ 管理员自定义服务(优先生效)
xxx.service.d/ 对已有服务做局部覆盖
简单记忆:
系统默认 → /lib/systemd/system
自己写的 → /etc/systemd/system
覆盖修改 → xxx.service.d