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

systemd服务脚本详解与管理命令

一、systemd简介

 1.1、systemd的简介

         systemd是Linux系统的基础组件集合,它提供了系统的服务管理(可简单理解为Windows的任务管理),运行后是PID=1的进程(是其他所有进程的父进程);历史上systemd中的服务(service)还被称作守护进程(daemon),它们在后台运行为特定的事件提供服务。监视和控制systemd的主要命令是【systemctl】。

systemd的功能
序号systemd的功能
1支持并行化的任务
2同时采用socket式与D-Bus总线式启用服务
3按需启动守护进程(daemon)
4利用Linux的CGroups监视进程
5支持快照和系统恢复
6维护挂载点和自动挂载点
7各服务间基于依赖关系进行精密控制
8支持SysV和LSB初始脚本(可替代sysvinit)
9还可控制基础系统配置(如:简单的网络配置、时间同步、日志转发和域名解析等),维护登录用户列表及其系统账户、运行时的目录和设置
10还可以运行容器和虚拟机

        在不同版本的Linux(红帽系)系统中,对于管理服务的方式是有区别的:

        《1》在Centos6及其之前的版本中,如果要写服务脚本,那这些服务脚本是必须放置在【/etc/init.d】目录下的,且这些脚本都是bash脚本,编写复杂。

        《2》在RHEL7/Centos7及其之后的Linux版本中,采用了新的方式【unit】管理服务,这种方式编写服务脚本按照标准格式编写即可,且可以通过systemd命令集对这些编写好的脚本进行管理,较为简单便捷

 1.2、systemd的说明与使用

systemd说明
序号systemd内容说明
1systemd

systemd是Linux上的系统守护进程管理工具,最后的字母d表示(daemon)是守护进程的缩写;故systemd表示守护系统含义;

systemd可以管理Linux系统中的所有资源,不同的资源统称为Unit。常见的Unit有:

《1》Service Unit:文件扩展名为【.service】用于定义系统服务;

《2》Target Unit:文件扩展名为【.target】用于模拟实现“运行级别”;

《3》Mount Unit:文件扩展名为【.mount】用于定义文件系统挂载点;

systemd是内核启动后的第一个用户进程,PID是1,是其他所有进程的父进程。

2服务存放路径

服务文件的存放路径:

《1》【/etc/systemd/system/】系统管理员手动软件安装包或脚本放置在此,优先级更高;

《2》【/run/systemd/system/】运行时配置文件,该目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时【即:session级别的,才在这里修改】;

《3》【/usr/lib/systemd/system/】该目录包含的是软件包安装的单元,也就是说通过yum\dnf\rpm等软件包管理命令管理的systemd单元文件,都放置在该目录下;

《4》【/lib/systemd/sytem/】该目录下的单元一部分指向【/usr/lib/systemd/system】

注意:systemd默认从【/etc/systemd/system/】目录下读取配置文件,但是该目录下存放的大部分文件都是符号链接(指向的是【/usr/lib/systemd/system/】目录;也就是说真正的文件是存放在该个目录下)

3systemctl语法

systemctl command unit(配置的应用名称)

command常用选项:

《1》【start】启动指定的应用服务【systemctl start nginx

《2》【stop】关闭指定的应用服务【systemctl stop nginx

《3》【restart】重启指定的应用服务【systemctl restart nginx

《4》【reload】重载指定的应用服务【systemctl reload nginx

《5》【enable】系统开机时自动启动指定应用服务【systemctl enable nginx

《6》【disable】开机时不自动运行指定应用服务【systemctl disable nginx

《7》【status】查看指定应用服务的运行状态【systemctl status nginx

《8》【is-enabled】查看指定的服务是否配置为自动启动【systemctl is-enabled nginx】

《9》【mask】屏蔽指定服务,使其无法启动【systemctl mask nginx】

《10》【unmask】取消屏蔽指定服务【systemctl unmask nginx】

二、systemd Unit资源文件解析

 2.1、典型的服务单元文件示例

[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop[Install]
WantedBy=multi-user.target

一般我们自己创建的服务内容有三个部分,如上示例所示的

我们自己创建的服务单元包含的常用三个结构段
序号服务单元所需的三个结构段说明
1[Unit]服务单元的通用信息(知道这个服务是什么,有什么要求、能做什么)
2[Service]服务单元的具体配置内容(启动什么内容、什么时候启动、如何启动)
3[Install]服务单元的安装信息(给那些服务做依赖或依赖哪些服务)
一个完整的systemd Unit文件可能包含的结构段
序号结构段Unit文件类型说明
1[Unit]所有类型用于描述Unit及其配置依赖内容
2[Service].service服务本体的内容配置(包含服务生命周期和上下文配置)
3[Install]所有类型设置Unit用于那种目标中
4[Socket].socket套接字设置
5[Timer].timer用于配置定时触发任务(可替代Crontab)
6[Path].path用于监控指定目录或文件的变化,并触发其他Unit运行
7[Mount].mount用于定义系统结构层次中的一个挂载点(可用于替代过去的/etc/fstab)
8[Swap].swap用于定义一个用户做虚拟内存的交换分区
9[Slice].slice用于表示一个CGroup的树(通常用户不会自己创建这样的Unit文件)
10[Scope].scope用于描述一些系统服务的分组信息(这种文件是systemd运行时产生的)

 2.2、用户可配置的Unit资源文件结构段内容详解

  2.2.1、Unit结构段解析

[Unit]结构段说明
序号配置选项说明
1Description=对本Unit(服务)的描述,方便了解是什么(会在查看该Unit状态时显示)
2Documentation=本服务的帮助文档链接,方便用户更好的学习使用该服务内容
3Requires=

本服务依赖的其他Unit列表,这些请求的Unit模块会在本服务启动时同时被启动

注意:若这些Unit中任意一个启动失败,本服务也会被终止,无法启动

4Wants=

与Requires相似;这些请求的Unit模块会在本服务启动时同时被启动

注意:这些Unit中的模块有启动失败的,都不会影响本服务的启动

5

Before=

After=

定义启动顺序:

Before=xxx.service(代表本服务必须在xxx.service启动之前启动运行后才启动);

After=xxx.service,代表本服务在xxx.service完全启动成功后才会启动本服务。

6Binds To=

与Requires相似,这些请求的Unit模块会在本服务启动时同时被启动

注意:本服务与这些绑定的Unit要么一起启动成功,要么一起启动失败;且绑定的任意Unit出现意外结束或重启时,本服务也会跟着终止或重启。

7Part Of=是Binds To作用的子集,仅在这个设置的Unit所属模块失败或重启时,终止或重启当前的服务,不会随本服务的启动而启动
8OnFailure=当本服务启动失败时,就会自动启动这里配置的这些Unit
9Conflicts=配置与当前Unit冲突的其他模块,它们不能同时共存(即:如果列出的模块中有已经在运行的,这个服务就不能启动,反之亦然)
10Condition...=Unit启动前的条件判断(如ConditionPathExists=ConditionUser=)等内容判断
11Assert...=资源判断,但是这个内容失败时会导致硬错误,Unit无法启动

  2.2.2、Service结构段解析 

[Service]结构段说明
序号配置选项说明
1Type=

设置服务启动时的进程行为,有如下五种类型可选:

《1》simple(默认类型,简单服务)【执行ExecStart指定的程序命令,作为主进程(即启动的命令程序内容就是主体程序,这个程序要是退出,那么一切都退出】;

《2》forking(标准启动方式)【服务包含父进程和子进程,启动程序后,会调用 fork() 函数,通过父进程生成子进程】;

《3》oneshot(一次性启动)【启动完成执行一次后,进程就没了;通常用于初始化】;

《4》notify(与simple 类似)【但是notify会在当前服务启动完毕后,会发送一个readiness信号通知systemd继续往下执行】;

《5》idle(延迟到所有任务处理完成后在启动本服务);

《6》dbus(当前的服务通过D-BUS启动)

2ExecStart=服务启动时执行的命令【此命令就是服务的主体】必须指定
3ExecStartPre=在本服务(ExecStart)执行前所用调用的命令
4ExecStartPost=在本服务(ExecStart)执行后所用调用的命令
5ExecStop=停止本服务(ExecStart)时执行的命令
6ExecStopPost=定制本服务(ExecStart)后执行的命令
7ExecReload=定义重新载入服务的命令
8Restart=

配置服务的重启策略(即:何种情况下会重启服务):

《1》no(默认配置,表示不重启);

《2》on-success(表示成功退出时重启);

《3》on-failure(表示非0退出时重启);

《4》always(无论如何都重启);

《5》on-abnormal(信号或core dump时重启)

9RestartSec=设置服务重启前的延迟秒数
10RemainAfterExit=

适用于 oneshot 类型,服务执行后是否保持“激活”状态

值可设置为true或false,默认是false;当配置为true时,systemd只会负责启动服务进程,之后即使本服务进程退出了,systemd也仍然会认为这个服务还在运行中(该配置主要适用于一些非常驻内存,启动后立即退出,然后等待消息按需启动的服务如:oneshot类型)

11

TimeoutStartSec=

TimeoutStopSec=

启动服务时的允许等待的秒数(若超过时间仍然没有停止,systemd则会使用SIGKILL信号强行杀死服务);

停止服务时允许的等待秒数(若超过时间仍然没有停止,systemd则会使用SIGKILL信号强行杀死服务);

12

User=

Group=

服务运行所使用的用户;

服务运行所使用的用户组;

13WorkingDirectory=指定服务的工作目录
14RootDirectory指定服务进程的根目录(如果配置了这个参数,服务将无法访问指定目录以外的任何文件)
15

Environment=

EnvironmentFile=

为本服务设置环境变量;

指定加载一个包含本服务所需的环境变量列表文件,文件中的每一行都是一个环境变量定义;

16

StandardOutput=

StandardError=

设置日志的输出(journal,syslog,null,tty等)
17

LimitCPU=

LimitNOFILE=

LimitNPROC=

限制CPU核数;

限制文件句柄数量;

限制子进程数量;

18Nice服务进程的优先级,指越小则优先级别越高(默认是0,-20为最高优先级,19为最低优先级)

注意:启动(ExecStart)、重启(Restart)、停止(ExecStop)命令全部要求使用绝对路径ExecStartPre 和 ExecStartPost 辅助命令,若前面有个 “-” 符号,表示忽略这些命令的出错

  2.2.3、Install结构段解析 

[Install]结构段说明
序号配置选项说明
1WantedBy=

表示依赖当前服务的模块;值可以是一个或多个Target(值一般为【multi-user.target】

当前Unit激活时(enable)符号链接会放入【/etc/systemd/system/】目录下的【xxx.target.wants】目录里面(如:/etc/systemd/system/multi-user.target.wants)

2RequiredBy=表示当前服务会被添加到其他 unit 的 Requires= 依赖中
3Also本服务(Unit)激活(enable)或禁用(disable)时,会同时激活或禁用这里设置的Unit
4Alias本服务(Unit)可用于启动的别名,提供给systemctl调用

  2.2.4、Timer结构段解析 

[Timer]结构段说明
序号配置选项说明
1OnCalendar=设置定时的启动服务的时间(类似cron表达式,具体设置可参考systemd.time(7))如:daily
2OnBootSec=开机后多久启动(如:10min)
3OnUnitActiveSec=上次激活后多久再次启动(如:1h)
OnUnitInactiveSec=上次激活停用后多久再次启动(如:1h)
4RandomizedDelaySec=设置随机选择的均匀方式延迟计时器(范围是0和指定时间)【默认是0,表示不应用随机延迟】
5AccuracySec=指定计时器的精度(默认是1分钟)
6Persistent=是否补偿丢失事件【默认值是false】(若设置为true则上次触发的存储在磁盘本地的service Unit在计时器激活时会立即触发该服务;若计时器处于非活动状态期间则至少触发一次)

  2.2.5、Path结构段解析

[Path]结构段解析
序号配置选项说明
1

PathExists=

用于监视文件或目录是否存在(如果指定的文件存在,则激活已配置的单元);

2PathExistsGlob= 也是用于监视文件或目录是否存在(但会检查@通配符是否存在,且至少有一个文件与指定的通配模式匹配)
3PathChanged=可用于监视文件或目录并激活已配置的单元(即:每当它发生变化时,它不会在每次写入监视文件时激活 ;但是,如果打开写入的文件被关闭后,则会激活它)
4PathModified=与PathChanged类似,且这里在文件被写入时就会被激活
5DirectoryNotEmpty=可用于监视目录且目录至少包含一个文件
6Unit=被触发的Unit名称
7MakeDirectory=

采用boolean值配置【默认是false】,如果设置true,在在监视之前创建路径;

注意:如果使用了PathExists设置则此项无效。

8DirectoryMode=如果启用了MakeDirectory=配置,则需要再这里指定有问题的目录,且给目录授权(采用数字表示法:如:0755)
9TriggerLimitIntervalSec=配置次路径Unit的频率限制在特定的时间间隔内激活(单位有:us\ms\s\min\h...)【默认间隔为2s】

三、其他资料

systemd - Arch Linux 中文维基https://wiki.archlinuxcn.org/wiki/Systemd#

http://www.xdnf.cn/news/1098505.html

相关文章:

  • vue3 td 标签优化时间显示
  • LFU 缓存
  • 【笔记分享】集合的基数、群、环、域
  • QT解析文本框数据——概述
  • 实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12
  • 文件系统子系统 · 核心问题问答精要
  • 【性能测试】jmeter+Linux环境部署和分布式压测,一篇打通...
  • 动态规划疑惑总结
  • Ajax之核心语法详解
  • OpenCV探索之旅:多尺度视觉与形状的灵魂--图像金字塔与轮廓分析
  • 安全访问云端内部应用:用frp的stcp功能解决SSH转发的痛点
  • 【Nginx】Nginx 安装与 Sticky 模块配置
  • 使用Docker将Python项目部署到云端的完整指南
  • 网络安全(初级)(1)
  • 显卡GPU的架构和工作原理
  • QT Android 如何打包大文件到目录下?
  • Android ViewBinding 使用与封装教程​​
  • 【数据结构与算法】数据结构初阶:动态顺序表各种方法(接口函数)复盘与整理
  • 模块三:现代C++工程实践(4篇)第二篇《性能调优:Profile驱动优化与汇编级分析》
  • uniapp滚动组件, HuimayunScroll:高性能移动端滚动组件的设计与实现
  • 深入理解oracle ADG和RAC
  • 【大模型推理论文阅读】Enhancing Latent Computation in Transformerswith Latent Tokens
  • 毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线
  • 无人机抗风模块运行与技术难点分析
  • AI 智能体:开启自动化协作新时代
  • 浪潮CD1000-移动云电脑-RK3528芯片-2+32G-开启ADB ROOT破解教程
  • UE5源码模块解析与架构学习
  • Spring Boot 3.4 :@Fallback 注解 - 让微服务容错更简单
  • 大健康IP如何借“合规创新”抢占行业新风口|创客匠人
  • 创始人IP如何进阶?三次关键突破实现高效转化