超越基础:释放 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 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
