当前位置: 首页 > news >正文

超越基础:释放 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提供了许多高级功能,使得系统服务的管理更为灵活和精细。以下是一些高级服务管理的主题,包括高级服务配置、环境变量设置以及一些服务单元文件的高级选项:

高级服务配置:

  1. 资源限制和控制:

    • 使用Limit*选项可以设置服务的资源限制,如内存、文件描述符等。例如,LimitNOFILE限制服务的文件描述符数量。
  2. 安全性设置:

    • systemd提供了一些选项来增强服务的安全性,如ProtectSystemProtectHome,用于限制对系统和用户家目录的访问权限。
  3. 私有临时文件系统:

    • 通过设置PrivateTmp=true,可以为服务创建一个私有的临时文件系统,使得服务无法访问其他服务的临时文件。

环境变量设置:

  1. EnvironmentFile:

    • 使用EnvironmentFile选项可以从文件中加载环境变量。在服务单元文件中添加EnvironmentFile=/path/to/file,文件中包含的变量会在服务启动时被加载。
  2. Environment:

    • 直接在服务单元文件中使用Environment选项可以设置服务的环境变量。例如,Environment=VAR1=value1 VAR2=value2
  3. EnvironmentDirectory:

    • 使用EnvironmentDirectory选项可以指定一个目录,该目录下的所有文件将被加载为环境变量。每个文件应该包含一个环境变量定义。

服务单元文件的高级选项:

  1. ExecReload:

    • ExecReload定义了在服务重新加载时执行的命令。这在需要重新加载配置的服务中很有用。
  2. RestartSec:

    • RestartSec定义了在服务失败后重新启动之前等待的时间。这可以防止服务在短时间内频繁地启动和停止。
  3. Slice:

    • Slice选项允许将服务放置到指定的cgroup切片中,用于更精细地管理服务的资源。
  4. ProtectSystem和ProtectHome:

    • 这两个选项用于增加服务的安全性,限制对系统和用户家目录的访问权限。
  5. CapabilityBoundingSet:

    • 通过设置CapabilityBoundingSet,可以限制服务的权限,防止它获取超出必需权限范围之外的其他能力。
  6. NoNewPrivileges:

    • 当设置为true时,NoNewPrivileges选项禁止服务创建新的用户特权,提高安全性。

通过使用这些高级选项,系统管理员可以更好地定制和控制系统服务的行为。这对于满足特定安全性需求、资源管理和环境配置非常有用。

第二:用户空间与systemd-nspawn

systemd-nspawn是systemd提供的一个容器管理工具,它允许在用户空间中创建和管理轻量级的容器。这些容器提供了一个独立的文件系统和进程空间,使得用户可以在其内运行一个或多个进程。以下是关于systemd-nspawn的概述以及一个简单的使用示例:

systemd-nspawn的应用:

  1. 轻量级容器:

    • systemd-nspawn提供了一种轻量级的容器化解决方案,类似于传统的chroot,但具有更多功能和隔离。
  2. 文件系统隔离:

    • 每个容器都有自己的文件系统,这使得它们可以拥有独立的根目录,并与主机系统和其他容器隔离。
  3. 系统隔离:

    • 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命令用法:

  1. 查看所有单元的状态:

    systemctl status
    

    这将显示系统中所有单元(服务、目标、定时器等)的当前状态。

  2. 查看特定服务的状态:

    systemctl status servicename
    

    这将显示特定服务的详细状态信息,包括是否正在运行、最后一次启动时间等。

  3. 启动服务:

    sudo systemctl start servicename
    

    这将启动指定的服务。

  4. 停止服务:

    sudo systemctl stop servicename
    

    这将停止指定的服务。

  5. 重启服务:

    sudo systemctl restart servicename
    

    这将停止并重新启动指定的服务。

  6. 查看服务的日志:

    journalctl -u servicename
    

    这将显示特定服务的日志,可以用于故障排除和监控服务的运行状态。

  7. 启用服务开机自启:

    sudo systemctl enable servicename
    

    这将设置服务在系统启动时自动启动。

  8. 禁用服务开机自启:

    sudo systemctl disable servicename
    

    这将设置服务在系统启动时不自动启动。

  9. 查看单元的所有依赖关系:

    systemctl list-dependencies servicename
    

    这将列出指定单元(服务、目标等)的所有依赖关系。

一些建议:

  1. 使用systemctl status进行快速查看:
    在日常使用中,使用systemctl status命令可以快速了解系统的运行状态和服务的健康状况。

  2. 结合journalctl进行日志分析:
    结合journalctl命令,可以更详细地分析服务的日志信息,有助于快速定位问题。

  3. 使用systemctl list-units进行全面查看:
    通过systemctl list-units命令可以查看系统中所有活动的单元,这有助于全面了解系统的运行状况。

  4. 合理使用enabledisable
    仅将确实需要在系统启动时运行的服务设置为自动启动,避免不必要的开机启动服务。

  5. 使用别名进行缩写:
    例如,sudo systemctl restart可以简写为sudo systemctl restart,这有助于提高命令输入的效率。

  6. 定期检查服务状态:
    定期使用systemctl status检查关键服务的状态,以及时发现和解决潜在的问题。

通过充分利用systemctl命令,系统管理员可以更轻松地管理和监控系统服务,确保它们在期望的状态下运行。

第四:系统配置与systemd配置文件

systemd的配置文件采用INI文件格式,通常存储在/etc/systemd/目录下。以下是一些常见的systemd配置文件和配置项,以及一个实际案例来演示如何修改系统行为。

systemd配置文件的结构:

  1. 服务单元文件:

    • 服务单元文件的扩展名为.service,通常存储在/etc/systemd/system/目录下。

    • 典型的服务单元文件结构:

      [Unit]
      Description=My Service[Service]
      ExecStart=/path/to/executable
      
  2. 定时器单元文件:

    • 定时器单元文件的扩展名为.timer,通常存储在/etc/systemd/system/目录下。

    • 典型的定时器单元文件结构:

      [Unit]
      Description=My Timer[Timer]
      OnCalendar=daily
      Persistent=true
      
  3. 系统目标文件:

    • 系统目标文件的扩展名为.target,通常存储在/etc/systemd/system/目录下。

    • 典型的系统目标文件结构:

      [Unit]
      Description=My Target[Install]
      WantedBy=multi-user.target
      

常见的配置项:

  1. Description

    • 用于提供对单元(服务、定时器、目标等)的简要描述。
  2. ExecStart

    • 用于指定服务启动时执行的命令。
  3. OnCalendar

    • 用于指定定时器何时触发的时间规则。
  4. WantedBy

    • 用于指定一个目标单元的名称,表示单元应该由哪个目标单元所依赖。
  5. 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
  1. Type=simple 指定服务的类型为简单。这表示 systemd 仅等待服务的启动完成,而不会跟踪服务的子进程。对于简单的服务,systemd 会通过监测主进程的状态来确定服务是否正在运行。
  2. Restart=always 这个配置项指示 systemd 在服务终止时始终尝试重新启动。无论是由于正常退出还是发生错误,systemd 都会尝试重新启动服务。
  3. 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");} } 这段代码的问题是&#xff1a;如果抛出了异常&#xff0c;那么定义的string对象将面临毫无意义的构造…...

np.random.uniform() 采样得到的是一个高维立方体,而不是球体,为什么?

在代码中&#xff0c;采样是通过以下方式完成的&#xff1a; samples self.center np.random.uniform(-self.radius, self.radius, (num_samples, len(self.center))) 这里&#xff0c;np.random.uniform函数在每个维度独立地生成了一个介于-self.radius和self.radius之间的…...

1 时间序列模型入门: LSTM

0 前言 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种用于处理序列数据的神经网络。相比一般的神经网络来说&#xff0c;他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义&#xff0c;RNN就能够很好…...

1-Python与设计模式--单例模式

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

Rust之构建命令行程序(一):接受命令行参数

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

Go 谈论了解Go语言

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

《C++PrimerPlus》第9章 内存模型和名称空间

9.1 单独编译 Visual Studio中新建头文件和源代码 通过解决方案资源管理器&#xff0c;如图所示&#xff1a; 分成三部分的程序&#xff08;直角坐标转换为极坐标&#xff09; 头文件coordin.h #ifndef __COORDIN_H__ // 如果没有被定义过 #define __COORDIN_H__struct pola…...

uniapp上架app store详细攻略

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

面试:线上问题处理

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

Vue3中快速Diff算法

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

ROS2+STM32小车红外对射光电计数器模块资料

数据&#xff1a;一个周长内有20个孔洞或者20个分隔。外径&#xff1a;6.8cm 图片不是实物图&#xff0c;是示意图 因为没有串口&#xff0c;所以不可能会发送出数字的&#xff0c;就是通过电压变化次数来计算距离或者其他数据 有遮挡时&#xff0c;输出高电平&#xff0c;无遮…...

Android设计模式--桥接模式

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

1、分布式锁实现原理与最佳实践(一)

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

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、逐行代码解读

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

scipy 笔记:scipy.spatial.distance

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

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...