超越基础:释放 Systemd 的全部潜力【systemd 二】
🎏:你只管努力,剩下的交给时间
🏠 :小破站
超越基础:释放 Systemd 的全部潜力【systemd 二】
- 前言
- 第一:系统服务高级管理
- 高级服务配置:
- 环境变量设置:
- 服务单元文件的高级选项:
- 第二:用户空间与systemd-nspawn
- systemd-nspawn的应用:
- systemd-nspawn使用示例:
- 1. 创建容器:
- 2. 进入容器:
- 3. 退出容器:
- 4. 列出所有容器:
- 5. 查看容器状态:
- 6. 停止容器:
- 第三:系统管理与systemctl
- 常见的`systemctl`命令用法:
- 一些建议:
- 第四:系统配置与systemd配置文件
- systemd配置文件的结构:
- 常见的配置项:
- 实际案例:
- 第五:实际应用案例(应用重启)
- 创建service
- 执行相应的命令
前言
在 Linux 世界中,systemd 是一个非常强大的工具,但它的深度显然超出了日常的基础用法。本文将引导您走进 systemd 的高级领域,揭示其更多的用途和潜力。通过本文文章文章,你将能够以更高效和精密的方式管理和调整 Linux 系统。
第一:系统服务高级管理
systemd提供了许多高级功能,使得系统服务的管理更为灵活和精细。以下是一些高级服务管理的主题,包括高级服务配置、环境变量设置以及一些服务单元文件的高级选项:
高级服务配置:
-
资源限制和控制:
- 使用
Limit*
选项可以设置服务的资源限制,如内存、文件描述符等。例如,LimitNOFILE
限制服务的文件描述符数量。
- 使用
-
安全性设置:
- systemd提供了一些选项来增强服务的安全性,如
ProtectSystem
和ProtectHome
,用于限制对系统和用户家目录的访问权限。
- systemd提供了一些选项来增强服务的安全性,如
-
私有临时文件系统:
- 通过设置
PrivateTmp=true
,可以为服务创建一个私有的临时文件系统,使得服务无法访问其他服务的临时文件。
- 通过设置
环境变量设置:
-
EnvironmentFile:
- 使用
EnvironmentFile
选项可以从文件中加载环境变量。在服务单元文件中添加EnvironmentFile=/path/to/file
,文件中包含的变量会在服务启动时被加载。
- 使用
-
Environment:
- 直接在服务单元文件中使用
Environment
选项可以设置服务的环境变量。例如,Environment=VAR1=value1 VAR2=value2
。
- 直接在服务单元文件中使用
-
EnvironmentDirectory:
- 使用
EnvironmentDirectory
选项可以指定一个目录,该目录下的所有文件将被加载为环境变量。每个文件应该包含一个环境变量定义。
- 使用
服务单元文件的高级选项:
-
ExecReload:
ExecReload
定义了在服务重新加载时执行的命令。这在需要重新加载配置的服务中很有用。
-
RestartSec:
RestartSec
定义了在服务失败后重新启动之前等待的时间。这可以防止服务在短时间内频繁地启动和停止。
-
Slice:
Slice
选项允许将服务放置到指定的cgroup切片中,用于更精细地管理服务的资源。
-
ProtectSystem和ProtectHome:
- 这两个选项用于增加服务的安全性,限制对系统和用户家目录的访问权限。
-
CapabilityBoundingSet:
- 通过设置
CapabilityBoundingSet
,可以限制服务的权限,防止它获取超出必需权限范围之外的其他能力。
- 通过设置
-
NoNewPrivileges:
- 当设置为
true
时,NoNewPrivileges
选项禁止服务创建新的用户特权,提高安全性。
- 当设置为
通过使用这些高级选项,系统管理员可以更好地定制和控制系统服务的行为。这对于满足特定安全性需求、资源管理和环境配置非常有用。
第二:用户空间与systemd-nspawn
systemd-nspawn是systemd提供的一个容器管理工具,它允许在用户空间中创建和管理轻量级的容器。这些容器提供了一个独立的文件系统和进程空间,使得用户可以在其内运行一个或多个进程。以下是关于systemd-nspawn的概述以及一个简单的使用示例:
systemd-nspawn的应用:
-
轻量级容器:
- systemd-nspawn提供了一种轻量级的容器化解决方案,类似于传统的chroot,但具有更多功能和隔离。
-
文件系统隔离:
- 每个容器都有自己的文件系统,这使得它们可以拥有独立的根目录,并与主机系统和其他容器隔离。
-
系统隔离:
- systemd-nspawn创建的容器具有独立的进程空间,这意味着容器内的进程不会影响主机系统或其他容器。
systemd-nspawn使用示例:
以下是一个简单的示例,演示如何使用systemd-nspawn创建和管理容器:
1. 创建容器:
sudo systemd-nspawn -bD /path/to/container/root
-b
参数表示在容器内启动一个引导进程。-D
参数指定容器的根目录。
2. 进入容器:
sudo machinectl shell root@containername
这将进入容器的shell环境,可以在其中执行命令。
3. 退出容器:
在容器内部的shell环境中,可以使用exit
命令退出容器。
4. 列出所有容器:
machinectl list
这将列出当前系统中所有正在运行的容器。
5. 查看容器状态:
machinectl status containername
这将显示有关特定容器的详细信息,包括其进程状态和IP地址。
6. 停止容器:
machinectl poweroff containername
这将关闭并停止指定的容器。
通过这些简单的命令,可以创建、管理和监视systemd-nspawn容器。systemd-nspawn提供了一个简单而灵活的方式,让用户能够在一个独立的运行环境中运行应用程序或进行实验,而不必使用更重量级的虚拟化解决方案。
第三:系统管理与systemctl
systemctl
是systemd中用于管理系统服务的命令行工具。它提供了一种统一的方式来查看和控制系统的状态和服务。以下是一些常见的systemctl
命令用法,以及一些建议如何更有效地使用它:
常见的systemctl
命令用法:
-
查看所有单元的状态:
systemctl status
这将显示系统中所有单元(服务、目标、定时器等)的当前状态。
-
查看特定服务的状态:
systemctl status servicename
这将显示特定服务的详细状态信息,包括是否正在运行、最后一次启动时间等。
-
启动服务:
sudo systemctl start servicename
这将启动指定的服务。
-
停止服务:
sudo systemctl stop servicename
这将停止指定的服务。
-
重启服务:
sudo systemctl restart servicename
这将停止并重新启动指定的服务。
-
查看服务的日志:
journalctl -u servicename
这将显示特定服务的日志,可以用于故障排除和监控服务的运行状态。
-
启用服务开机自启:
sudo systemctl enable servicename
这将设置服务在系统启动时自动启动。
-
禁用服务开机自启:
sudo systemctl disable servicename
这将设置服务在系统启动时不自动启动。
-
查看单元的所有依赖关系:
systemctl list-dependencies servicename
这将列出指定单元(服务、目标等)的所有依赖关系。
一些建议:
-
使用
systemctl status
进行快速查看:
在日常使用中,使用systemctl status
命令可以快速了解系统的运行状态和服务的健康状况。 -
结合
journalctl
进行日志分析:
结合journalctl
命令,可以更详细地分析服务的日志信息,有助于快速定位问题。 -
使用
systemctl list-units
进行全面查看:
通过systemctl list-units
命令可以查看系统中所有活动的单元,这有助于全面了解系统的运行状况。 -
合理使用
enable
和disable
:
仅将确实需要在系统启动时运行的服务设置为自动启动,避免不必要的开机启动服务。 -
使用别名进行缩写:
例如,sudo systemctl restart
可以简写为sudo systemctl restart
,这有助于提高命令输入的效率。 -
定期检查服务状态:
定期使用systemctl status
检查关键服务的状态,以及时发现和解决潜在的问题。
通过充分利用systemctl
命令,系统管理员可以更轻松地管理和监控系统服务,确保它们在期望的状态下运行。
第四:系统配置与systemd配置文件
systemd的配置文件采用INI文件格式,通常存储在/etc/systemd/
目录下。以下是一些常见的systemd配置文件和配置项,以及一个实际案例来演示如何修改系统行为。
systemd配置文件的结构:
-
服务单元文件:
-
服务单元文件的扩展名为
.service
,通常存储在/etc/systemd/system/
目录下。 -
典型的服务单元文件结构:
[Unit] Description=My Service[Service] ExecStart=/path/to/executable
-
-
定时器单元文件:
-
定时器单元文件的扩展名为
.timer
,通常存储在/etc/systemd/system/
目录下。 -
典型的定时器单元文件结构:
[Unit] Description=My Timer[Timer] OnCalendar=daily Persistent=true
-
-
系统目标文件:
-
系统目标文件的扩展名为
.target
,通常存储在/etc/systemd/system/
目录下。 -
典型的系统目标文件结构:
[Unit] Description=My Target[Install] WantedBy=multi-user.target
-
常见的配置项:
-
Description
:- 用于提供对单元(服务、定时器、目标等)的简要描述。
-
ExecStart
:- 用于指定服务启动时执行的命令。
-
OnCalendar
:- 用于指定定时器何时触发的时间规则。
-
WantedBy
:- 用于指定一个目标单元的名称,表示单元应该由哪个目标单元所依赖。
-
Requires
:- 用于指定服务单元依赖的其他单元。
实际案例:
假设有一个服务单元文件 /etc/systemd/system/myapp.service
,它描述了一个简单的服务:
[Unit]
Description=My Application[Service]
ExecStart=/path/to/myapp
如果要修改该服务的行为,可以考虑以下场景:
-
场景:修改服务的运行参数
在
[Service]
部分添加ExecStart
行:[Service] ExecStart=/path/to/myapp --my-argument=value
-
场景:增加服务的依赖
在
[Unit]
部分添加Requires
行:[Unit] Description=My Application Requires=mydependency.service[Service] ExecStart=/path/to/myapp
-
场景:修改服务的描述信息
修改
[Unit]
部分的Description
行:[Unit] Description=Updated Description for My Application[Service] ExecStart=/path/to/myapp
修改配置后,使用以下命令重新加载systemd配置:
sudo systemctl daemon-reload
然后可以使用 sudo systemctl restart myapp.service
来使更改生效。
通过理解systemd配置文件的结构和常见配置项,以及实际案例的修改方式,系统管理员可以更灵活地配置和管理系统服务。
第五:实际应用案例(应用重启)
创建service
1️⃣:cd /etc/systemd/system/
,进入到这个目录下,创建一个service文件,如下
[Unit]
Description=My Python Script[Service]
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/bin/python3 /home/csdn/curl_csdn.py[Install]
WantedBy=multi-user.target
Type=simple
: 指定服务的类型为简单。这表示systemd
仅等待服务的启动完成,而不会跟踪服务的子进程。对于简单的服务,systemd
会通过监测主进程的状态来确定服务是否正在运行。Restart=always
: 这个配置项指示systemd
在服务终止时始终尝试重新启动。无论是由于正常退出还是发生错误,systemd
都会尝试重新启动服务。RestartSec=5
: 指定在尝试重新启动服务之前等待的时间(以秒为单位)。在这个例子中,等待 5 秒后尝试重新启动服务。
在 systemd
服务单元文件中的 [Install]
部分用于定义服务的安装信息,包括服务启动时的目标(target)。
具体来说:
WantedBy=multi-user.target
: 这个指令表示服务希望被添加到multi-user.target
,这是一个多用户环境的基本目标。multi-user.target
是 Linux 系统中启动到多用户环境的主要目标。当你使用systemctl enable
启用服务时,systemd
将为服务创建符号链接,使其在系统启动时自动启动到multi-user.target
。
这就意味着,通过 sudo systemctl enable my_python_script
命令,你可以使你的服务在系统启动时自动启动到多用户环境。
如果你希望服务在其他目标下启动,你可以更改 WantedBy
指令的值,例如 graphical.target
(图形界面目标)等,具体取决于你的需求。
执行相应的命令
# 重新加载 systemd 配置,以使新的服务单元文件生效
systemctl daemon-reload
# 启动服务
systemctl start 你所创建的service文件名,不加.service
相关文章:

超越基础:释放 Systemd 的全部潜力【systemd 二】
🎏:你只管努力,剩下的交给时间 🏠 :小破站 超越基础:释放 Systemd 的全部潜力【systemd 二】 前言第一:系统服务高级管理高级服务配置:环境变量设置:服务单元文件的高级选…...

Flask学习二:项目拆分、请求与响应、cookie
教程 教程地址: 千锋教育Flask2框架从入门到精通,Python全栈开发必备教程 老师讲的很好,可以看一下。 项目拆分 项目结构 在项目根目录下,创建一个App目录,这是项目下的一个应用,应该类似于后端的微服…...

6、Qt延时的使用
一、sleep() 1、说明 QThread类中如下三个静态函数: QThread::sleep(n); //延迟n秒 QThread::msleep(n); //延迟n毫秒 QThread::usleep(n); //延迟n微妙 这种方式使用简单,但是会阻塞线程,有界面时界面会卡死,一般在非GUI线…...

《Effective C++》条款26
尽可能延后变量定义式的出现时间 string test(const string& passwd) {string s;if (s.size() < MinLenth){throw logic_error("passwd is too short");} } 这段代码的问题是:如果抛出了异常,那么定义的string对象将面临毫无意义的构造…...

np.random.uniform() 采样得到的是一个高维立方体,而不是球体,为什么?
在代码中,采样是通过以下方式完成的: samples self.center np.random.uniform(-self.radius, self.radius, (num_samples, len(self.center))) 这里,np.random.uniform函数在每个维度独立地生成了一个介于-self.radius和self.radius之间的…...

1 时间序列模型入门: LSTM
0 前言 循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好…...

1-Python与设计模式--单例模式
23种计模式之 前言 (5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、(11)策略模式、责任链模式、命令模式、中介者模…...

Rust之构建命令行程序(一):接受命令行参数
开发环境 Windows 10Rust 1.73.0 VS Code 1.84.2 项目工程 这次创建了新的工程minigrep. IO工程:构建命令行程序 这一章回顾了到目前为止你所学的许多技能,并探索了一些更标准的库特性。我们将构建一个与文件和命令行输入/输出交互的命令行工具&#…...

Go 谈论了解Go语言
一、引言 Go的历史回顾 Go语言(通常被称为Go或Golang)由Robert Griesemer、Rob Pike和Ken Thompson在2007年开始设计,并于2009年正式公开发布。这三位设计者都曾在贝尔实验室工作,拥有丰富的编程语言和操作系统研究经验。Go的诞生…...

《C++PrimerPlus》第9章 内存模型和名称空间
9.1 单独编译 Visual Studio中新建头文件和源代码 通过解决方案资源管理器,如图所示: 分成三部分的程序(直角坐标转换为极坐标) 头文件coordin.h #ifndef __COORDIN_H__ // 如果没有被定义过 #define __COORDIN_H__struct pola…...

uniapp上架app store详细攻略
目录 uniapp上架app store详细攻略 前言 一、登录苹果开发者网站 二、创建好APP 前言 uniapp开发多端应用,打包ios应用后,会生成一个ipa后缀的文件。这个文件无法直接安装在iphone上,需要将这个ipa文件上架app store后,才能通…...

面试:线上问题处理
文章目录 在处理线上问题时,你的排查思路和步骤是什么线上偶发性问题如何处理和跟踪当系统出现大量错误日志时,你会如何分析和解决问题在高并发场景中,如何排查和解决线程安全问题当系统出现大规模的故障时,你的应急处理和恢复策略…...

Vue3中快速Diff算法
在Vue3中,快速Diff算法主要用于优化虚拟DOM的更新过程,减少不必要的DOM操作,提高性能。以下是对Vue3源码中快速Diff算法的解读: 首先,我们需要引入Vue3的相关包: import { reactive, toRefs, watch } fro…...

ROS2+STM32小车红外对射光电计数器模块资料
数据:一个周长内有20个孔洞或者20个分隔。外径:6.8cm 图片不是实物图,是示意图 因为没有串口,所以不可能会发送出数字的,就是通过电压变化次数来计算距离或者其他数据 有遮挡时,输出高电平,无遮…...

Android设计模式--桥接模式
闻正言,行正道,左右前后皆正人 一,定义 将抽象部分与实现部分分离,使它们都可以独立地进行变化 二,使用场景 从模式的定义中,我们大致可以了解到,这里的桥接的作用其实就是连接抽象部分与实现…...

1、分布式锁实现原理与最佳实践(一)
在单体的应用开发场景中涉及并发同步时,大家往往采用Synchronized(同步)或同一个JVM内Lock机制来解决多线程间的同步问题。而在分布式集群工作的开发场景中,就需要一种更加高级的锁机制来处理跨机器的进程之间的数据同步问题&…...

Autosar通信实战系列03-NM模块要点及其配置介绍
本文框架 前言1. NM模块要点介绍1.1 NM基本功能介绍1.2 NM协同功能介绍2. NM配置2.1 NmGlobalConfig配置2.2 NmChannelConfigs配置前言 在本系列笔者将结合工作中对通信实战部分的应用经验进一步介绍常用,包括但不限于通信各模块的开发教程,代码逻辑分析,调测试方法及典型问…...

Golang模块管理功能
文章目录 1. Golang 包管理1.1 GOPATH 包管理1.2 Go vendor 包管理1.3 Go modules包管理2. Go Modules 应用实践2.1 Go modules关键信息2.1.1 go mod 命令行2.1.2 配置代理服务2.2 创建项目2.3 获取依赖包2.4 运行项目1. Golang 包管理 1.1 GOPATH 包管理 第一阶段: Golang初…...

从零构建属于自己的GPT系列1:文本数据预处理、文本数据tokenizer、逐行代码解读
🚩🚩🚩Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1:文本数据预处理 从零构建属于自己的GPT系列2:语…...

scipy 笔记:scipy.spatial.distance
1 pdist 计算n维空间中观测点之间的成对距离。 scipy.spatial.distance.pdist(X, metriceuclidean, *, outNone, **kwargs) 1.1 主要参数 X一个m行n列的数组,表示n维空间中的m个原始观测点metric使用的距离度量out输出数组。如果非空,压缩的距离矩阵…...

java video audio encoder
引言 在现代互联网的时代,视频和音频已经成为人们生活中不可或缺的一部分。而在计算机科学中,视频和音频编码器则是将原始的视频和音频数据转换为可压缩格式的关键技术。在本文中,我们将探讨基于Java的视频和音频编码器的使用。 什么是视频…...

TypeScript 中声明类型的方法
1、使用:运算符来为变量和函数参数指定类型。例如: let num: number 5; function add(a: number, b: number): number {return a b; }2、使用 type 关键字来声明自定义类型别名。例如: type Point {x: number;y: number; };3、使用 interface 关键字…...

显示器校准软件BetterDisplay Pro mac中文版介绍
BetterDisplay Pro mac是一款显示器校准软件,可以帮助用户调整显示器的颜色和亮度,以获得更加真实、清晰和舒适的视觉体验。 BetterDisplay Pro mac软件特点 - 显示器校准:可以根据不同的需求和环境条件调整显示器的颜色、亮度和对比度等参数…...

Element UI 走马灯 实现鼠标滚动切换页面
鼠标滚动切换页面 elementui Carousel 走马灯鼠标滚轮事件实现 一、在轮播图外的盒子外添加鼠标滚轮事件,触发GoWheel函数。 wheel"goWheel"二、通过判断deltaY的数值来触发相应事件 它检查滚轮事件的deltaY属性是否大于0 event.deltaY当鼠标滚轮向下…...

在Docker上部署Springboot项目
在Docker上部署Springboot项目 ###1.安装docker 2.安装mysql 拉 Mysql 镜像 docker pull mysql:5.7.31运行 Mysql 5.7.31 第一次运行需要设置密码 docker run -d --name myMysql -p 9506:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD1234 mysql:5.7.31不是…...

2024中国眼博会,全国眼康与眼镜品牌加盟展会,北京眼健康展
立足北京,面向全球,2024第六届CEYEE中国眼博会,将以大规模的展览面积在4月与您相会; ——春天是万物复苏的季节,更是企业开拓市场,抓住春季发展机遇的重要时节;第六届CEYEE中国眼博会将在2024年…...

C++学习 --谓词
目录 1, 什么是谓词 1-1, 一元谓词 1-2, 二元谓词 1, 什么是谓词 返回bool类型的仿函数, 叫着谓词, 分为一元谓词和二元谓词 1-1, 一元谓词 operator()接收一个参数,叫着一元谓…...

Arkts深入了解运用 LazyForEach【鸿蒙专栏-17】
文章目录 深入了解 LazyForEach:数据懒加载LazyForEach概述接口描述IDataSource接口DataChangeListener接口使用限制和注意事项键值生成规则和组件创建规则首次渲染键值相同时错误渲染键值生成规则和组件创建规则首次渲染键值相同时错误渲染键值生成规则和组件创建规则首次渲染…...

如何让你的 Jmeter+Ant 测试报告更具吸引力?
引言 想象一下,你辛苦搭建了一个复杂的网站,投入了大量的时间和精力进行开发和测试。当你终于完成了测试并准备生成测试报告时,你可能会发现这个过程相当乏味,而对于其他人来说,它可能也不那么吸引人。 但是…...

游戏APP接入哪些广告类型
当谈到游戏应用程序(APP)接入广告时,选择适合用户体验和盈利的广告类型至关重要。游戏开发者通常考虑以下几种广告类型: admaoyan猫眼聚合 横幅广告: 这些广告以横幅形式显示在游戏界面的顶部或底部。它们不会打断游戏…...