Linux / Ubuntu systemd 服务使用说明

本文记录在 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 在加载服务时会:

  1. 读取原始 .service

  2. 再读取 .service.d/*.conf

  3. 合并配置

因此 .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
相关推荐
米高梅狮子4 小时前
第2章 docker容器
运维·docker·云原生·容器·架构·kubernetes·自动化
kidwjb5 小时前
信号量在进程中的使用
linux·进程间通信
闵孚龙5 小时前
Claude Code Ultraplan 远程多代理规划全解析:AI Agent、CCR远程容器、异步规划、状态机、计划传送与企业级自动化治理
运维·人工智能·自动化
sulikey6 小时前
个人Linux操作系统学习笔记2 - gcc与库的理解
linux·笔记·学习·操作系统·gcc·
二宝哥7 小时前
Linux虚拟机网络配置
linux·运维·服务器
卧室小白7 小时前
docker网络与服务编排与集群
运维·docker·容器
陳10307 小时前
Linux:进程间通信 和 简单进程池
linux·运维·服务器
数字化顾问7 小时前
(122页PPT)数字化架构的演进和治理(附下载方式)
java·运维·架构
jimy17 小时前
改.bashrc,直观地判断本地repo是否有改动
linux·服务器
zt1985q8 小时前
本地部署网页监控工具 Webmonitor 并实现外部访问
运维·服务器·网络·网络协议