Ubuntu 下 systemd 介绍
系列文章目录
Linux内核学习
Linux 知识(1)
Linux 知识(2)
WSL Ubuntu
QEMU 虚拟机
Linux 调试视频
PCIe 与 USB 的补充知识
vscode 使用说明
树莓派 4B 指南
设备驱动畅想
Linux内核子系统
Linux 文件系统挂载
QEMU 通过网络实现共享文件
OrangePi 学习摘录 —— 制作桌面版镜像
Radxa 学习摘录
Rockchip RK3399 - 引导流程和准备工作
制作Ubuntu根文件
制作RK3568 ubuntu20.04桌面版镜像
Rockchip RK3399 - 移植ubuntu 20.04.4根文件系统
文章目录
- 系列文章目录
- 1、init 启动方式
- 2、相关目录介绍
- 3、systemd 工作流程
- 1. 启动阶段
- 2. 加载配置文件
- 3. 确定运行模式
- 4. 启动基础服务
- 5. 启动目标服务
- 6. 服务管理
- 7. 日志管理
- 8. 资源控制
- 9. 故障恢复
- 总结
- 4、写一个 systemd 配置文件
- 1. 创建服务单元文件
- 2. 编写服务配置
- 3. 配置文件解析
- 4. 加载并启动服务
- 5. 注意事项
1、init 启动方式
init
进程启动后,负责初始化用户空间的系统服务和应用程序:
-
SysV init
(传统方式):
从/etc/inittab
文件读取配置,确定默认运行级别(如多用户模式或图形界面模式)。
启动基本系统服务,如网络服务、系统日志、用户登录服务(getty 等)。 -
systemd
(现代主流方式,Ubuntu 从 15.04 开始默认使用):
系统大部分组件被建模为systemd
服务。
通过目标单元(如 multi-user.target 或 graphical.target)协调服务启动顺序。
自动优化启动流程,减少依赖和启动时间。
2、相关目录介绍
以下是 systemd
功能相关的目录介绍:
/usr/lib/systemd/system
- 用途 :存放由软件包安装的
systemd
单元文件,包括各种服务(.service
)、目标(.target
)、挂载(.mount
)等单元文件。 - 特点 :该目录下的配置文件是由软件包管理器(如 apt、rpm 等)安装软件时自动放置的,通常不需要用户手动修改。它为系统提供了各种预定义的服务和功能配置。
/run/systemd/system
- 用途 :存放系统运行时动态生成的单元文件。这些文件通常是在系统运行过程中,由各种服务或进程根据需要创建的。
- 特点 :该目录下的配置文件具有中等优先级,一般很少被手动修改,除非需要调整程序运行时的一些参数,即 Session 级别的参数。
/etc/systemd/system
- 用途 :存放系统管理员自定义的
systemd
单元文件,或者通过systemctl enable
命令创建的开机启动服务的符号链接。 - 特点 :该目录下的配置文件优先级最高,如果同一选项在多个目录中都配置了,这里的配置会覆盖其他目录的配置。系统管理员可以在此目录中创建自己的单元文件,或者通过符号链接的方式启用或禁用服务。
/lib/systemd/system
- 用途 :与
/usr/lib/systemd/system
目录相同,用于存放软件包安装的 systemd 单元文件。 - 特点 :在许多 Linux 系统中,/lib 目录实际上是 /usr/lib 的符号链接,因此这两个目录在实际使用中是等价的。
3、systemd 工作流程
systemd
是现代 Linux 系统中广泛使用的初始化系统和服务管理器,负责在系统启动时管理和启动各种服务、资源和进程。以下是 systemd 的工作流程:
1. 启动阶段
- 内核启动
systemd
:- 内核加载完成后,会启动第一个用户空间进程
systemd
(PID=1)。systemd 是现代 Linux 系统的初始化进程,取代了传统的 init 进程。 systemd
会读取配置文件(如/etc/systemd/system/default.target
),确定系统的默认运行模式(如多用户模式或多用户图形界面模式)。
- 内核加载完成后,会启动第一个用户空间进程
2. 加载配置文件
- 系统初始化配置
systemd
从/etc/systemd/system.conf
文件中加载系统初始化配置,包括系统的运行模式、默认的依赖关系模式等。
- 单元文件查找
- 系统启动时,
systemd
首先会读取/etc/systemd/system
、/usr/lib/systemd/system
和/run/systemd/system
目录中的单元文件(例如.service
、.target
、.socket
等)。其中:/etc/systemd/system
:优先级最高,存放系统管理员自定义或使用 systemctl enable 启用的单元文件。/usr/lib/systemd/system
:存放软件包安装的默认单元文件。/run/systemd/system
:存放系统运行时生成的临时单元文件。
- 系统启动时,
3. 确定运行模式
- 运行模式(Target):
systemd
使用target
来定义系统的运行模式。常见的target
包括:multi-user.target
:多用户命令行模式。graphical.target
:图形化多用户模式。
- 默认运行模式由
/etc/systemd/system/default.target
文件指定。
4. 启动基础服务
- 基础服务启动:
- systemd 会启动一些基础服务,如:
- udev:管理设备节点。
- systemd-logind:管理用户会话。
- systemd-journald:管理日志系统。
- 这些服务是系统运行的基础设施,必须优先启动。
- systemd 会启动一些基础服务,如:
5. 启动目标服务
- 根据 target 启动服务:
- systemd 会根据目标 target 文件(如 multi-user.target 或 graphical.target)启动相关服务。
- 服务的配置文件通常位于
/etc/systemd/system/<target>.wants/
目录下。 - 服务启动时,systemd 会自动解析服务之间的依赖关系,并按需并行启动服务。
6. 服务管理
-
服务生命周期管理:
- systemd 提供了 systemctl 命令来管理服务,例如:
systemctl start <service>
:启动服务。systemctl stop <service>
:停止服务。systemctl restart <service>
:重启服务。systemctl status <service>
:查看服务状态。
- systemd 提供了 systemctl 命令来管理服务,例如:
-
开机自启管理:
通过systemctl enable <service>
和systemctl disable <service>
命令,可以启用或禁用服务的开机自启动。
7. 日志管理
- 日志记录:
systemd-journald
负责记录系统日志,日志存储在内存和磁盘中,便于快速查询。
- 日志查询:
- 使用
journalctl
命令可以查看日志,例如:journalctl -u <service>
:查看指定服务的日志。journalctl -b
:查看本次启动的日志。journalctl -f
:实时查看最新日志。
- 使用
8. 资源控制
- 资源隔离:
- systemd 使用控制组(cgroups)来隔离和限制服务的资源使用,例如内存、CPU 等。
- 沙盒运行:
- 可以通过配置文件中的选项(如 ProtectSystem=strict 和 PrivateTmp=true)增强服务的安全性。
9. 故障恢复
- 自动重启服务:
- 在服务配置文件中设置 Restart=on-failure,当服务崩溃时,systemd 会自动重启服务。
总结
systemd 的工作流程包括从系统启动到服务管理的全过程,其核心特点是:
- 并行启动:通过并行启动服务,显著缩短系统启动时间。
- 依赖管理:自动解析服务之间的依赖关系,确保服务按正确顺序启动。
- 统一管理:通过 systemctl 和 journalctl 命令,提供了一致的服务和日志管理接口。
4、写一个 systemd 配置文件
systemd
使用单元文件(unit files)来管理各种系统资源。以下是一个简单的自定义服务配置示例,我们将创建一个名为 my-custom-service.service
的服务。
1. 创建服务单元文件
在 /etc/systemd/system/
目录下创建一个新的单元文件,例如:/etc/systemd/system/my-custom-service.service
。
2. 编写服务配置
打开文件并添加以下内容:
[Unit]
Description=My Custom Service
After=network.target[Service]
Type=simple
User=myuser
ExecStart=/path/to/my/script.sh
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill $MAINPID
Restart=on-failure
RestartSec=5s[Install]
WantedBy=multi-user.target
3. 配置文件解析
-
[Unit]
节Description
:服务的简短描述。After
:指定该服务在 network.target 后启动,表示该服务依赖于网络服务。
-
[Service]
节Type
:定义服务类型,simple 表示服务启动后立即进入主进程。User
:指定服务运行的用户。ExecStart
:启动服务时执行的命令。ExecReload
:重新加载服务时执行的命令(此处示例为发送 HUP 信号)。ExecStop
:停止服务时执行的命令。Restart
:指定服务在失败时的重启策略,on-failure 表示服务失败时自动重启。RestartSec
:设置重启服务前的等待时间。
-
[Install]
节WantedBy
:指定该服务对应的目标(target),multi-user.target 表示在多用户模式下启动。
4. 加载并启动服务
- 重新加载 systemd 配置:
sudo systemctl daemon-reload
- 启动服务:
sudo systemctl start my-custom-service
- 设置开机自启:
sudo systemctl enable my-custom-service
- 检查服务状态:
sudo systemctl status my-custom-service
5. 注意事项
- 路径和权限:确保 ExecStart 指定的脚本路径正确,并且脚本具有可执行权限。
- 日志查看:使用 journalctl -u my-custom-service 查看服务日志,便于排查问题。
- 调试:如果服务启动失败,可以查看 /var/log/journal 中的系统日志。
通过以上步骤,你可以创建并配置一个自定义的 systemd 服务。
相关文章:

Ubuntu 下 systemd 介绍
系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) WSL Ubuntu QEMU 虚拟机 Linux 调试视频 PCIe 与 USB 的补充知识 vscode 使用说明 树莓派 4B 指南 设备驱动畅想 Linux内核子系统 Linux 文件系统挂载 QEMU 通过网络实现…...
BERT文本分类(PyTorch和Transformers)畅用七个模型架构
(PyTorch)BERT文本分类:七种模型架构 🌟 1. 介绍 使用BERT完成文本分类任务(如情感分析,新闻文本分类等等)对于NLPer已经是很基础的工作了!虽说已迈入LLM时代,但是BERT…...

两步在 Vite 中配置 Tailwindcss
第一步:安装依赖 npm i -D tailwindcss tailwindcss/vite第二步:引入 tailwindcss 更改配置 // src/main.js import tailwindcss/index// vite.config.js import vue from vitejs/plugin-vue import tailwindcss from tailwindcss/viteexport default …...
【vmware虚拟机安装教程】
以下是在VMware Workstation Pro上安装虚拟机的详细教程: 准备工作 下载VMware Workstation Pro 访问VMware官网下载并安装VMware Workstation Pro(支持Windows和Linux系统)。安装完成后,确保已激活软件(试用版或正式…...

文字转语音(三)FreeTTS实现
项目中有相关的功能,就简单研究了一下。 说明 FreeTTS 是一个基于 Java 的开源文本转语音(TTS)引擎,旨在将文字内容转换为自然语音输出。 FreeTTS 适合对 英文语音质量要求低、预算有限且需要离线运行 的场景,但若需…...

string类详解(上)
文章目录 目录1. STL简介1.1 什么是STL1.2 STL的版本1.3 STL的六大组件 2. 为什么学习string类3. 标准库中的string类3.1 string类3.2 string类的常用接口说明 目录 STL简介为什么学习string类标准库中的string类string类的模拟实现现代版写法的String类写时拷贝 1. STL简介 …...

Visual Studio Code使用ai大模型编成
1、在Visual Studio Code搜索安装roo code 2、去https://openrouter.ai/settings/keys官网申请个免费的配置使用...

外贸跨境订货系统流程设计、功能列表及源码输出
在全球化的商业环境下,外贸跨境订货系统对于企业拓展国际市场、提升运营效率至关重要。该系统旨在为外贸企业提供一个便捷、高效、安全的订货平台,实现商品展示、订单管理、物流跟踪等功能,满足跨境业务的多样化需求。以下将详细阐述外贸订货…...

TraeAi上手体验
一、Trae介绍 由于MarsCode 在国内由于规定限制,无法使用 Claude 3.5 Sonnet 模型,字节跳动选择在海外推出 Trae,官网:https://www.trae.ai/。 二、安装 1.下载安装Trae-Setup-x64.exe 2.注册登录 安装完成后,点击登…...

深入解析 vLLM:高性能 LLM 服务框架的架构之美(一)原理与解析
修改内容时间2.4.1处理请求的流程,引用更好的流程图2025.02.11首发2025.02.08 深入解析 vLLM:高性能 LLM 服务框架的架构之美(一)原理与解析 深入解析 vLLM:高性能 LLM 服务框架的架构之美(二)…...

thingboard告警信息格式美化
原始报警json内容: { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…...

redis解决高并发看门狗策略
当一个业务执行时间超过自己设定的锁释放时间,那么会导致有其他线程进入,从而抢到同一个票,所有需要使用看门狗策略,其实就是开一个守护线程,让守护线程去监控key,如果到时间了还未结束,就会将这个key重新s…...
Python函数的函数名250217
函数名其实就是一个变量,这个变量就是代指函数而已函数也可以被哈希,所以函数名也可以当作集合中的元素,也可作为字典的key值 # 将函数作为字典中的值,可以避免写大量的if...else语句 def fun1():return 123 def fun2():return 4…...

Unity 获取独立显卡数量
获取独立显卡数量 导入插件包打开Demo 运行看控制台日志 public class GetGraphicCountDemo : MonoBehaviour{public int count;// Start is called before the first frame updatevoid Start(){count this.GetIndependentGraphicsDeviceCount();}}...

JAVA生产环境(IDEA)排查死锁
使用 IntelliJ IDEA 排查死锁 IntelliJ IDEA 提供了强大的工具来帮助开发者排查死锁问题。以下是具体的排查步骤: 1. 编写并运行代码 首先,我们编写一个可能导致死锁的示例代码: public class DeadlockExample {private static final Obj…...

如何正确安装Stable Diffusion Web UI以及对应的xFormers
本文是我总结的步骤,验证了几次保证是对的。因为正确的安装 Stable Diffusion Web UI 以及对应的 xFormers 实在是太麻烦了,官方和网上的步骤都是残缺和分散的,加上国内网络速度不理想,所以需要一些额外步骤,之前研究出…...
机器学习_14 随机森林知识点总结
随机森林(Random Forest)是一种强大的集成学习算法,广泛应用于分类和回归任务。它通过构建多棵决策树并综合它们的预测结果,显著提高了模型的稳定性和准确性。今天,我们就来深入探讨随机森林的原理、实现和应用。 一、…...
机器学习基本篇
文章目录 1 基本概念2 基本流程2.0 数据获取2.1 预处理2.1.0 认识数据认识问题2.1.1 不平衡标签的处理a.随机过采样方法 ROS,random over-samplingb. SMOTE synthetic minority Over-Sampling Technique2.2 缺失值处理2.3 数据清洗2.3.0离散特征编码2.3.1 连续特征处理归一化标…...
vue2.x与vue3.x生命周期的比较
vue2.x 生命周期图示: new Vue() | v Init Events & Lifecycle | v beforeCreate | v created | v beforeMount | v mounted | v beforeUpdate (when data changes) | v updated | v beforeDestroy (when vm.…...

接口测试及常用接口测试工具(Postman/Jmeter)
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...