Linux系统服务之一次性服务(2)
接前一篇文章:Linux系统服务之一次性服务(1)
本文内容参考以下文章:
Systemd OneShot 系统启动时运行一次特定的命令或脚本,并在执行完毕后自动退出-CSDN博客
oneshot一次性服务_type=oneshot-CSDN博客
systemd.service 中文手册 [金步国]
Systemd 入门教程:实战篇 - 阮一峰的网络日志
特此致谢!
三、读懂服务配置文件
上一回已讲过,systemd的Service Unit文件(服务单位文件)用于配置和管理系统中的服务。Service Unit文件的扩展名为.service,通常存储在/etc/systemd/system/目录下或/usr/lib/systemd/system/目录下。
下面是Service Unit文件的一些常见组成部分即配置项:
1. [Unit] 部分
此部分定义服务的基本信息、启动顺序与依赖关系。包括以下字段:
- Description
描述此服务的简短说明、简单描述。
- Documentation
给出文档位置。
- After
指定此服务在哪些其它服务之后启动。
- Before
指定此服务在哪些其它服务之前启动。
注:After和Before字段只涉及启动顺序,不涉及依赖关系。
- Requires、Wants、BindsTo
指定此服务所依赖的其它服务。其中:Wants表示当前服务与其所依赖服务之间的弱依赖关系,即如果所依赖服务启动失败或异常退出,并不影响当前服务继续执行;Requies表示当前服务与其所依赖服务之间的强依赖关系,即如果所依赖服务启动失败或异常退出,那么当前服务也必须退出。
注:Requires和Wants字段只涉及依赖关系,不涉及启动顺序。
2. [Service] 部分
此部分定义服务的执行参数和行为,更通俗地说是定义如何启动当前服务。分为命令、类型、重启行为三类。
(1)命令
包括以下字段:
- ExecStart
在启动该服务时需要执行的命令行(命令+参数)。即指定服务的启动命令或可执行文件路径。
- ExecStop
当该服务被要求停止时所执行的命令行。即停止该服务时执行的命令。执行完此处设置的所有命令行之后,该服务将被视为已经停止。此字段是可选的。
- ExecStartPre
在执行ExecStart之前执行的命令行。即启动此服务之前执行的命令。
- ExecStartPos
在执行ExecStart之后执行的命令行。即启动此服务之后执行的命令。
- ExecStopPost
在该服务停止之后所执行的命令行。无论服务是否启动成功, 此选项中设置的命令都会在服务停止后被无条件的执行。此字段是可选的。
- ExecReload
当该服务被要求重新载入配置时所执行的命令行。即重新加载服务配置时执行的命令。此字段是可选的。
- Environment
设置环境变量。
- EnvironmentFile
从指定的文件中加载环境变量。即指定当前服务的环境参数文件。
(2)类型
Type字段用于定义服务的类型,其指定了如何启动和管理服务的主进程。通过在Service Unit文件中设置Type选项,可以根据服务的特性和需求选择合适的服务类型,以确保systemd正确地管理和监控服务的状态和行为。Type选项的值可以是以下之一:
- simple(默认值)
如果设为simple(当设置了ExecStart=、 但是没有设置Type=与BusName=时,这是默认值), 那么ExecStart=进程就是该服务的主进程,并且systemd会认为在创建了该服务的主服务进程之后,该服务就已经启动完成。
如果此进程需要为系统中的其它进程提供服务,那么必须在该服务启动之前先建立好通信渠道(例如套接字)。 这样,在创建主服务进程之后、执行主服务进程之前,即可启动后继单元,从而加快了后继单元的启动速度。
simple最常见的服务类型。当使用simple类型时,systemd假定服务的主进程会一直运行,直到服务被显式停止或发生错误。这是大多数服务的默认类型。
- exec
exec与simple类似,不同之处在于,只有在该服务的主服务进程执行完成之后,systemd才会认为该服务启动完成。其它后继单元必须一直阻塞到这个时间点之后才能继续启动。换句话说,simple表示当fork()返回时,即算是启动完成,而exec则表示仅在fork()与execve()函数都执行成功时,才算是启动完成。这就意味着对于exec类型的服务来说,如果不能成功调用主服务进程(例如User=不存在、或者二进制可执行文件不存在),那么systemctl start将会执行失败。
- forking
如果设为forking,那么表示ExecStart=进程将会在启动过程中使用fork()系统调用。也就是当所有通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为主服务进程继续运行。 这是传统UNIX守护进程的经典做法。 在这种情况下,systemd 会认为在父进程退出之后,该服务就已经启动完成。
如果使用了此种类型,那么建议同时设置PIDFile=选项,以帮助systemd准确可靠的定位该服务的主进程。systemd将会在父进程退出之后 立即开始启动后继单元。
forking适用于那些在启动过程中会创建一个子进程的服务。在这种类型的服务中,systemd会等待主进程启动,并通过监视子进程的退出来确定服务的启动状态。通常,服务的主进程会立即启动子进程,然后退出,而子进程则负责实际的服务运行。
- oneshot
oneshot与simple类似,不同之处在于,只有在该服务的主服务进程退出之后,systemd才会认为该服务启动完成,才会开始启动后继单元。此种类型的服务通常需要设置RemainAfterExit=选项。 当Type=与ExecStart=都没有设置时,Type=oneshot就是默认值。
oneshot适用于只需执行一次操作的服务,例如在系统启动时运行一个脚本或执行一个命令。当服务的主进程退出后,systemd将认为服务已经完成,并将其标记为已停止。
- dbus
dbus与simple类似,不同之处在于,该服务只有获得了BusName=指定的D-Bus名称之后,systemd才会认为该服务启动完成,才会开始启动后继单元。设为此类型相当于隐含的依赖于dbus.socket单元。当设置了BusName=时, 此类型就是默认值。
用于通过DBus系统总线启动的服务。这种类型的服务通常用于与其它进程进行通信或提供DBus接口。
- notify
notify与exec类似,不同之处在于,该服务将会在启动完成之后通过sd_notify(3)之类的接口发送一个通知消息。systemd将会在启动后继单元之前,首先确保该进程已经成功的发送了这个消息。
如果设为此类型,那么下文的NotifyAccess=将只能设为非none值;如果未设置NotifyAccess=选项、或者已经被明确设为none,那么将会被自动强制修改为main。
notify适用于在服务启动完成后向systemd发送通知的服务。服务主进程应在启动完成后向systemd发送一个特定的信号,以通知systemd该服务已准备好接受请求。
注意:目前Type=notify尚不能与PrivateNetwork=yes一起使用。
- idle
idle与simple类似,不同之处在于,服务进程将会被延迟到所有活动任务都完成之后再执行。这样可以避免控制台上的状态信息与shell脚本的输出混杂在一起。
idle适用于以非常低优先级运行的服务。这种类型的服务将在所有其它活动任务完成后才会启动。
相关文章:
Linux系统服务之一次性服务(2)
接前一篇文章:Linux系统服务之一次性服务(1) 本文内容参考以下文章: Systemd OneShot 系统启动时运行一次特定的命令或脚本,并在执行完毕后自动退出-CSDN博客 oneshot一次性服务_typeoneshot-CSDN博客 systemd.serv…...
Vue项目解决van-calendar 显示白色空白,需滑动一下屏幕,才可正常显示
问题描述,如图 ipad(平板)或者 H5移动端引入Vant组件的日历组件(van-calendar),初始化显示空白,需滚动一下屏幕,才可正常显示 解决方法 需在van-calendar上绑定open"openCalendar"事件…...
Linux:可视化管理工具Webmin的安装
一、下载 地址:Webmin官网 我这里下载的是1.700-1版本 二、安装 1、在虚拟机上新建目录并安装软件 mkdir /opt/webmin rpm -ivh webmin-1.700-1.noarch.rpm2、修改webmin的root密码 /usr/libexec/webmin/changepass.pl /etc/webmin root 1234563、修改端口(可…...
WARNING: Access control is not enabled for the database.
MongoDB shell version v3.4.24 WARNING: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted. 1)未启用访问控制 2)读写访问不受限制 D:\MongoDB\Server\3.4\bin>mongo MongoDB shell version v3.4.24 c…...
JavaScript编程进阶 – Return语句
JavaScript编程进阶 – Return语句 JavaScript Programming Advanced – Return Statement By JacksonML 就像人们习惯的函数一样,总觉得在函数体最后需要一个return语句,标志着函数的结束,就像下面这个函数 theFunc() 那样。 function theFunc() { re…...
Python与设计模式--备忘录模式
23种计模式之 前言 (5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、(11)策略模式、责任链模式、命令模式、中介者模…...
04_Flutter自定义Slider滑块
04_Flutter自定义Slider滑块 一.Slider控件基本用法 Column(mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[Text("sliderValue: ${_sliderValue.toInt()}"),Slider(value: _sliderValue,min: 0,max: 100,divisions: 10,thumbColor: Colors.…...
服务器数据恢复—EMC存储raid5故障导致上层应用崩溃的数据恢复案例
服务器存储数据恢复环境: EMC某型号存储,8块组建一组raid5磁盘阵列。上层操作系统采用zfs文件系统。 服务器存储故障&分析: raid5阵列中有2块硬盘未知原因离线,raid5阵列崩溃,上层应用无法正常使用。 服务器数据恢…...
7.1 Windows驱动开发:内核监控进程与线程回调
在前面的文章中LyShark一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以监控进程线程创建为例,在Win10系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原…...
基于ssm的汽车论坛管理系统设计与实现
基于ssm的汽车论坛管理系统设计与实现 摘要:信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题…...
实习开发日志经验总结(一)
文章目录 前言实习日志经验总结 前言 自己之前实习过程中遇到的问题以及相应的解决过程,我都有记录形成比较凌乱的实习日志。故想在整个实习日志的基础上,提炼一些技术知识点或者是解决问题的思路。考虑到实习项目的不方便公开性,所以会隐去…...
【Unity基础】8.简单场景的搭建
【Unity基础】8.简单场景的搭建 大家好,我是Lampard~~ 欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢 (一)场景资源 (1)Import资源包 今天我们将手动去搭一个简单的场景,当…...
傅里叶变换及其在机器学习中的应用
一、介绍 傅立叶变换是一种数学技术,在各个科学和工程领域发挥着关键作用,其应用范围从信号处理到量子力学。近年来,它在机器学习领域发现了新的意义。本文探讨了傅里叶变换的基础知识及其在机器学习应用中日益增长的重要性。 …...
xorm源码学习
文章目录 XORM源码浅析及实践ORMORM vs. SQLXORM软件架构 ORM 引擎 Engine——DBM*core.DB Golang:database/sql 源码基本结构连接复用,提高性能。增加数据库连接池数量连接管理 database/sql主要内容:sql.DB创建数据库连接sql.Open()DB.conn…...
Vue3中的<script setup>和<script>的区别
相同点 在一个 Vue3 单文件组件 (SFC)中,<script setup> 和 <script> 它们各自最多只能存在一个。 不同点 <script setup> 这个脚本块将被预处理为组件的 setup() 函数,这意味着它将为每一个(也可以说每一次)组件实例都执行。 <…...
Docker笔记-Docker搭建最新版zabbix服务端(2023-07-31)
前言 一开始问chartgpt上,搭建的思路是对的,但命令和细节有问题,最后还是依靠StackOverflow解决的。一开始在amd的linux上搭建好docker版的zabbix,但放到arm的机器上就报错了,原因是指令集不匹配,最后跑到…...
QT配合CSS隐藏按钮
第一种方法 在Qt的CSS样式表中,使用 visibility 属性来隐藏按钮。设置 visibility 为 hidden 不可见,而设置为 visible 则可见。 隐藏所有 QPushButton QPushButton {visibility: hidden; }隐藏特定的按钮,用按钮的名称或样式类进行定位就…...
2023亚太地区数学建模C题思路分析+模型+代码+论文
目录 1.2023亚太地区各题思路模型:比赛开始后,第一时间更新,获取见文末名片 3 常见数模问题常见模型分类 3.1 分类问题 3.2 优化问题 详细思路见此名片,开赛第一时间更新 1.亚太地区数学建模ABC题思路模型:9比赛开…...
Linguistic Steganalysis in Few-Shot Scenario论文阅读笔记
TIFS期刊 A类期刊 新知识点 Introduction Linguistic Steganalysis in Few-Shot Scenario模型是个预训练方法。 评估了四种文本加密分析方法,TS-CSW、TS-RNN、Zou、SeSy,用于分析和训练的样本都由VAE-Stego生产(编码方式使用AC编码)。 实验是对比在少样…...
详细学习Pyqt5的4种项目部件(Item Widget)
Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图(Item View) 快速弄懂Pyqt5的4种项目部件(Item Widget) 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
