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

关机时,如何控制systemd服务的关闭顺序

关机时,如何控制systemd服务的关闭顺序?

在工作中,我们通常遇到的问题是,如何控制systemd服务的启动顺序,同志们第一反应就会是使用Before=或者After=去进行控制。 问题来了,如果服务启动时没有顺序要求,但是关闭时有顺序要求, 该如何操作?

通过查找如下相关文档, 我查到了这样一段话:

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

When two units with an ordering dependency between them are shut down, the inverse of the start-up order is applied. I.e. if a unit is configured with After= on another unit, the former is stopped before the latter if both are shut down.

上面这段话的意思是,如果使用After=或者Before=规定了进程的启动顺序, 那么关闭时的顺序与启动时的顺序将是相反的。

比如有A、B、C三个服务, 启动时的顺序时A->B->C, 那么服务的关闭顺序将是C->B->A。 事实是这样的吗? 下面通过一个小实验进行验证。

验证systemd的关闭顺序

这里我们准备三个服务,服务在启动时候会向文件中写入相应的启动和关闭日志,通过日志我们来判断服务的启动和关闭顺序。

首先是test1.sh, 该文件接受start/stop两个命令行参数, 启动时写入日志start1, 关闭时写入日志stop1。

#!/bin/bash
case "$1" in
start)
echo "start1" >> /home/test/test.log
;;
stop)
echo "stop1" >> /home/test/test.log
;;
*)
esac

下面是test1服务的systemd的service文件test1.service,这里我们只需要脚本执行一次,因此使用的Type是oneshot类型,并且指定RemainAfterExit=yes,意思是该脚本只会执行一次,并且退出后, 不会意味着服务是inacive状态, 将会显示服务是active(exited)状态。

[Unit]
Description=mytest:while date service
After=network.target sshd.service[Service]
Type=oneshot
ExecStart= /home/test/test1.sh start
ExecStop= /home/test/test1.sh stop
RemainAfterExit=yes[Install]
WantedBy=multi-user.target

test2.sh与test1.sh类似,只是打印的日志内容不同。

#!/bin/bash
case "$1" in
start)
echo "start2" >> /home/test/test.log
;;
stop)
echo "stop2" >> /home/test/test.log
;;
*)
esac

test2.service同test1.service, 不同的是我在After中增加了test1.service, 这就意味着test2晚于test1启动。

[Unit]
Description=mytest:while date service
After=network.target sshd.service test1.service[Service]
Type=oneshot
ExecStart= /home/test/test2.sh start
ExecStop= /home/test/test2.sh stop
RemainAfterExit=yes[Install]
WantedBy=multi-user.target

test3.sh同test1.sh

#!/bin/bash
case "$1" in
start)
echo "start3" >> /home/test/test.log
;;
stop)
echo "stop3" >> /home/test/test.log
;;
*)
esac

test3.service同test1.service,不同的是我在After中增加了test2.service, 这就意味着test3晚于test2启动。

[Unit]
Description=mytest:while date service
After=network.target sshd.service test2.service[Service]
Type=oneshot
ExecStart= /home/test/test3.sh start
ExecStop= /home/test/test3.sh stop
RemainAfterExit=yes[Install]
WantedBy=multi-user.target

通过下面的命令将三个服务分别加入到systemd的目录中,并且启动它们并设为开机启动。

cp test1.service /usr/lib/systemd/system/
cp test2.service /usr/lib/systemd/system/
cp test3.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable test1
systemctl enable test2
systemctl enable test3
systemctl start test1
systemctl start test2
systemctl start test3

此时,test.log文件已经打印出了刚刚手动执行启动命令产生的日志

[root@localhost test]# cat test.log
start1
start2
start3

通过上述的步骤,我们构建出了三个服务,这三个服务的启动顺序是test1->test2->test3, 那么根据我们的推测, 关闭顺序应该是test3->test2->test1,是否如此呢?

下面就是到了最终验证的时刻!

reboot

等待一小会后,我们打印出test.log

[root@localhost test]# cat test.log
start1
start2
start3
stop3
stop2
stop1
start1
start2
start3

可以看到停止时依次打印出了stop3,stop2,stop1。这与我们的猜想以及文档中的说明是一致的。

结论

systemd通过After和Before可以指定服务的启动顺序, 在系统关闭时,服务的关闭顺序和启动顺序是相反的, 先启动的后关闭,后启动的先关闭。

相关文章:

关机时,如何控制systemd服务的关闭顺序

关机时,如何控制systemd服务的关闭顺序? 在工作中,我们通常遇到的问题是,如何控制systemd服务的启动顺序,同志们第一反应就会是使用Before或者After去进行控制。 问题来了,如果服务启动时没有顺序要求,但…...

关于MySQL镜像构建过程中添加自动初始化数据库

需求描述一般而言,我们在拉取了 mysql 镜像并运行之后,其中的并不会存在我们自定义的数据库,都是在镜像运行后,自己主动导入数据库,那么有没有方式可以一运行 mysql 镜像,对应生成的 mysql 容器中就有我们自…...

CS144-Lab2

实验架构 除了写入传入流之外,TCPReceiver 还负责通知 sender 两件事: “First unassembled” 字节的索引,称为“acknowledgment”或 “ackno”。这是接收方需要来自发送方的第一个字节。“first unassembled ” 索引和“first unacceptable…...

Linux内核驱动之efi-rtc

Linux内核驱动之efi-rtc1. UEFI与BIOS概述1.1. BIOS 概述1.1.1. BIOS缺点:1.1.2. BIOS的启动流程1.2 UEFI 概述1.2.1 Boot Sevices:1.2.2. Runtime Service:1.2.3. UEFI优点:1.2.4. UEFI启动过程:1.3 Legacy和UEFI1.4 …...

Java 字符串

文章目录一、API二、String1. String 构造方法2. String 对象的特点3. 字符串的比较4. 用户登录案例5. 遍历字符串6. 统计字符次数7. 拼接字符串8. 字符串反转三、StringBuilder1. 构造方法2. 添加及反转方法3. 与 String 相互转换4. 拼接字符串升级版5. 字符串反转升级版一、A…...

麦克风阵列波束基本概念理解

波束形成 本质上是设计合适的滤波器,对于一类固定滤波器系数的阵列来说,无论输入信号或者噪声信号的统计特征如何,其滤波器系数固定不变,此类波束形成叫Fixed Beamforming,固定波束形成好比传统数字信号处理里面的经典…...

JAVA保姆式JDBC数据库免费教程之02-连接池技术

连接池 连接池概念 ​ 概念:其实就是一个容器(集合),存放数据库连接的容器。 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完…...

视频片段怎么做成gif图?快试试这2种方法

动态gif图片作为当下非常常用的表情包,其丰富的内容生动的画面深受大众喜爱。那么,当我们想要将电影或是电视剧中的某一片段做成gif动态图片的时候,要如何操作呢?接下来,给大家分享两招视频转化gif的小窍门–使用【GIF…...

2.20计算机如何工作

一.计算机组成1.冯诺依曼体系CPU 中央处理器: 进行算术运算和逻辑判断.存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)输入设备: 用户给计算机发号施令的设备.输出设备: 计算机个用户汇报结果的设备内存和外存的区别(面试)访问速度:内存快,外存慢存储空间:内存小,外…...

[golang gin框架] 5.Cookie以及Session

1.Cookie(1).介绍HTTP 是无状态协议,简单地说,当浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站,每一次的访问,都是没有任何关系的,如果要实现多个页面之间共享数据的话就可以…...

【牛客刷题专栏】0x0B:JZ3 数组中重复的数字(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录前言问题…...

js中的隐式类型转换有哪些

目录一、隐式类型转换条件二、 的隐式类型转换三、 的隐式类型转换四、object 的隐式类型转换探讨 object 的隐式转换执行顺序探讨 Symbol.toPrimitive 属性如何将对象转换为原始值在前端js这门动态弱类型语言中,不仅存在着显示类型转换,还存在许多隐式类…...

WuThreat身份安全云-TVD每日漏洞情报-2023-02-17

漏洞名称:IBM Aspera Faspex 预身份验证 RCE 漏洞 漏洞级别:高危 漏洞编号:CVE-2022-47986 相关涉及:IBM Aspera Faspex 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-02805 漏洞名称:Kardex Mlog MCC PATH 遍历 漏洞级别:严重 漏洞编号:CVE…...

掌握MySQL分库分表(三)水平分库分表常见策略range、hash

文章目录range策略Range策略延伸基于Range范围分库分表业务场景hash取模案例规则水平分库分表,根据什么规则进行划分? range策略 自增id,根据ID范围进行分表(左闭右开) 规则案例: 1~1,000,000 是 table…...

CTFer成长之路之CTF中的SQL注入

CTF中的SQL注入CTF SQL注入 SQL注入-1 题目描述: 暂无 docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-sql-1:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{union_select_is_so_cool} Wri…...

python snap7读写PLC

主要在DB块里操作 读DB块 import snap7 import structdef plc_connection():PLC_IP 192.168.10.10PLC snap7.client.Client()PLC.connect(PLC_IP, rack0, slot1)return PLCPLC plc_connection()PLC.read_area()方法从PLC中读取指定区域的数据。 1200表示DB块的编号&#x…...

使用物联网进行智能能源管理的10大优势

如今,物联网推动了许多行业的自动化流程和运营效率,而物联网在能源领域的应用尤其受到消费者、企业甚至政府的关注。除了对电力供应链的诸多好处之外,物联网能源管理系统还让位于新的智能电网,并有望实现更高的安全性和效率。基于…...

工业4.0和工业物联网如何协同工作

虽然许多公司已经接受了工业物联网,但他们现在必须接受工业4.0对数据驱动的数字化转型的承诺。随着制造业、能源、公用事业和供应链应用迅速采用工业物联网(IIoT),这些行业的新现实正在形成。工业物联网提供了企业管理数千个活动部件所需的数据类型&…...

Python机器学习入门笔记(3)—— 线性回归

目录 线性回归 算法简述 LinearRegression() API SGDRegressor API LinearRegression() 和 SGDRegressor对比 过拟合与欠拟合 岭回归 应用场景 线性回归 算法简述 线性回归是一种基本的机器学习算法,它用于建立自变量和因变量之间的线性关系模型。它假设…...

Java:顶级Java应用程序服务器 — Tomcat、Jetty、GlassFish、WildFly

如果你想编写Java web应用程序,首先需要做出一个艰难的决定:选择运行应用程序的Java应用程序服务器。什么是应用服务器?一般来说,应用程序服务器执行Java应用程序。在操作系统中启动它们,然后将应用程序部署到其中。将应用程序服…...

华人辍学博士揪出Claude Code 51万行源码泄露,官方请求下架超8000个GitHub代码库并回应:这次是人为失误,无人被解雇!

整理 | 苏宓 出品 | CSDN(ID:CSDNnews) 这两天 AI 圈的热点话题,莫过于 Claude Code 51 万行核心源码意外泄露事件。而这场风波的起点,并非什么高明的黑客攻击、也没有复杂的攻击路径,而是一位安全研究员的…...

linux下的pwm子系统

概念:PWM的概念就不多说了&#xff0c;pwm子系统如下:设备树:rk3568设备树pwm控制器里面已经配置了时钟&#xff0c;所以只需要使能节点就好了/* 使能 PWM12 节点 配置使用指定的引脚 状态设置为正常工作 */&pwm12 {status "okay";pinctrl-0 <&pwm12m1_…...

智能车竞赛备赛利器:用快马AI快速搭建算法仿真原型

智能车竞赛备赛利器&#xff1a;用快马AI快速搭建算法仿真原型 参加智能车竞赛的同学都知道&#xff0c;算法调试和硬件交互是最耗时的环节之一。传统开发流程中&#xff0c;光是搭建仿真环境就要花上好几天&#xff0c;更别说反复调试参数了。最近我发现InsCode(快马)平台能帮…...

Git误操作急救手册(7)Git核心概念回顾:工作区、暂存区、版本库

Git误操作急救手册(7)Git核心概念回顾:工作区、暂存区、版本库 昨天隔壁组的小王跑过来,满头大汗地问我:“哥,我改了一下午的驱动代码,git status一看全红了,手一抖直接git checkout .,现在全没了,能救吗?”我叹了口气,打开终端敲了几行命令,用git fsck找回了他的…...

【Java】从源码深入理解 Stack

从源码深入理解 StackStack的整体架构Stack的成员变量Stack的构造函数Stack的常用方法&#xff1a;源码解读压栈&#xff1a;push()出栈&#xff1a;pop()获取栈顶元素&#xff1a;peek()判断是否为空&#xff1a;empty()查找元素&#xff1a;search()存储的元素个数&#xff1…...

Blender场景教程:秘密实验室

BY:Express the Chaos关于我做了5年视觉设计师&#xff0c;但没有正式的3D背景。我十一个月前养成了通过概念艺术和3D表达自己的习惯&#xff0c;不得不向Blender介绍自己&#xff08;因为它是免费软件&#xff0c;我忍不住要用&#xff09;&#xff0c;以及制作3D场景的整个机…...

终极性能调优指南:如何配置dnstwist实现超高速域名扫描

终极性能调优指南&#xff1a;如何配置dnstwist实现超高速域名扫描 【免费下载链接】dnstwist Domain name permutation engine for detecting homograph phishing attacks, typo squatting, and brand impersonation 项目地址: https://gitcode.com/gh_mirrors/dn/dnstwist …...

2026届学术党必备的六大AI辅助论文工具实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网在近期对自己的 AIGC 检测服务进行了升级&#xff0c;其目的在于识别存在于论文之中的、…...

2026最权威的AI学术平台推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 把维普系统检测 AI 生成文本的特性揪住&#xff0c;要使 AI 率降下来&#xff0c;得从词汇、…...

116. 为项目监控员生成的警报添加标签

Procedure 程序To label alerts for Project Monitors, you must configure the Prometheus Federator Helm charts values section. This is done by adding additionalRuleLabels under defaultRules within helmProjectOperator. You can perform this modification during…...