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
相关推荐
唐青枫1 小时前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297914 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Web3探索者6 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo6 天前
Linux系统中网线与USB网络共享冲突
linux
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计