Linux systemctl 详解自定义 systemd unit

news2025/1/12 20:55:57

Linux systemctl 详解&自定义 systemd unit

systemctl

大家都知道,我们安装了很多服务之后,使用 systemctl 来管理这些服务,比如开启、重启、关闭等等,所以 systemctl 是一个 systemd 系统。centos 使用 systemctl 来代替 daemon chkconfig,原来的所有系统启动和管理系统服务全部由 systemctl 来代替。

systemctl 命令

我们可以查看官方给出的命令:

systemctl --help

在这里插入图片描述

可以看到 systemctl 包含两类命令, OPTIONSCOMMANDOPTIONS- 开头,而 COMMAND 则不会。

行头

如果我们直接执行 systemctl,则会打印

systemctl

在这里插入图片描述

可以看到行头为:

UNIT

UNIT 是统一了各种不同系统资源的配置格式,列如服务器的启停、定时任务、设备挂载、网络配置、虚拟内存等等。通过不同的后缀来区分这些配置文件。

包含 12 类:

LOAD

systemd 是否正确解析了单元的配置并将该单元加载到内存中。

loaded 表示成功加载到内存中,没有问题。

ACTIVE

高级单元激活状态。

The low-level unit activation state, values depend on unit type.

active 表示成功激活。

failed 表示激活失败。

SUB

低级单元激活状态。

The low-level unit activation state, values depend on unit type.

active 表示成功激活。

failed 表示激活失败。

DESCRIPTION

对该 unit 的一些描述。

OPTIONS

由于命令太多,只演示一些重要、常用的:

-t --type=TYPEList units of a particular type
–state=STATEList units with particular LOAD or SUB or ACTIVE state
-p --property=NAMEShow only properties by this name
-a --allShow all loaded units/properties, including dead/empty ones. To list all units installed on the system, use the ‘list-unit-files’ command instead.
-l --fullDon’t ellipsize unit names on output
-r --recursiveShow unit list of host and local containers
–reverseShow reverse dependencies with ‘list-dependencies’
–job -mode=MODESpecify how to deal with already queued jobs, when queueing a new job
–show-typesWhen showing sockets, explicitly show their type
-i --ignore-inhibitorsWhen shutting down or sleeping, ignore inhibitors
–kill-who=WHOWho to send signal to
-s --signal=SIGNALWhich signal to send
–nowStart or stop unit in addition to enabling or disabling it
-q --quietSuppress output
–no-blockDo not wait until operation finished
–no-wallDon’t send wall message before halt/power-off/reboot
–no-reloadDon’t reload daemon after en-/dis-abling unit files
–no-legendDo not print a legend (column headers and hints)
–no-pagerDo not pipe output into a pager
–no-ask-passwordDo not ask for system passwords
–globalEnable/disable unit files globally
–runtimeEnable unit files only temporarily until next reboot
-f --forceWhen enabling unit files, override existing symlinks When shutting down, execute action immediately
–preset-mode=Apply only enable, only disable, or all presets
–root=PATHEnable unit files in the specified root directory
-n --lines=INTEGERNumber of journal entries to show
-o --output=STRINGChange journal output mode (short, short-iso, short-precise, short-monotonic, verbose, export, json, json-pretty, json-sse, cat)
–plainPrint unit dependencies as a list instead of a tree

-t --type=TYPE

根据 UNIT 的 12 种类型来筛选,比如找出为 UNIT 为 service 类型:

systemctl --type=service # 所有服务的运行状态,但不包含系统服务

在这里插入图片描述

–state=ACTIVE

根据 state 进行筛选,如筛选运行中的:

systemctl --state=active --type=service

当然可以复合筛选,比如运行中的服务:

systemctl --state=active --type=service

COMMAND

mask 屏蔽服务

将服务进行屏蔽后,就无法通过 systemctl 来进行各种管理,如:

systemctl mask firewalld

在这里插入图片描述

可以看到,在 mask 之前是 loaded 状态,但是在之后就变成了 masked 状态,而且现在无法操控:

必须手动取消屏蔽,才可以继续操控(这里操控其实是启动,停止不收影响):

systemctl unmask firewalld
systemctl start firewalld

在这里插入图片描述

enable 开机启动

如果我们想将一个服务开机启动,那么我们可以:

systemctl enable chronyd
systemctl is-enabled chronyd # 查看是否设置了开机启动

在这里插入图片描述

关闭开机启动也很简单:

systemctl disable chronyd

start stop 启停

对某服务进行启停操作:

systemctl start chronyd
systemctl stop  chronyd

status 查看当前状态

systemctl status chronyd

在这里插入图片描述

状态打印出来分为两大部分,上面为该 UNIT 的状态,下面为最近的日志。

状态栏里面有:

● chronyd.service - NTP client/server # 基本描述

Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled) # 当前是否加载进内存(服务文件地址;;是否开机启动;)

Active: active (running) since 日 2022-11-27 17:25:18 CST; 1 day 4h ago # 当前运行情况;开始时间;持续时间

​ Docs: man:chronyd(8) # 在线文档地址 或者 man

​ man:chrony.conf(5)

Main PID: 6075 (chronyd) # 当前运行该 Unit 的进程

CGroup: /system.slice/chronyd.service # cgrpup 相关,包含调用栈

​ └─6075 /usr/sbin/chronyd

这里主要说下 Active:active(running),其实可能还有其他运行状态:

状态含义
active(running)表示程序正在执行
atcive(exited)执行一次就正常退出的服务,不在系统中执行任何程序
active(waiting)正在执行中,处于阻塞状态,需要等待其他程序执行完才能执行
inactive (dead)未启动状态

和开机启动项的状态(前面是当前状态,后面是默认状态):

启动状态含义
inactive服务关闭
disable服务开机不启动
enabled服务开机启动
static服务开机启动项被管理
failed服务配置错误

kill 杀死某服务

一般建议使用 stop 进行关闭,在无法 stop 情况下再使用该命令

systemctl kill chronyd

systemd 创建

我们刚刚看了很多关于 systemctl 的命令了,基本上学会了怎么进行使用,接下来我们需要自己创建一个 unit.server 进行一些简单的服务编排。

配置文件

在前面进行 status 命令讲解时,看到 Loaded 行有对应 server 的配置文件,我们以 chronyd 为例,查看这个程序是怎么加载的。

ll /usr/lib/systemd/system/chronyd.service
vim /usr/lib/systemd/system/chronyd.service

在这里插入图片描述

[Unit]

定义该 Unit 的加载问题和 status 上各种显示。

可选项描述
Description对当前服务的简单描述
After在XX启动后才启动。
Before在XX启动之前需要启动。
Conflicts异斥的服务,不能与这些服务共存。
Documentation使用手册说明,提供一个URIS的位置,一般用于man或者web访问,会被 status 公开,以便于发现。
ConditionPathExists这些路径存在才执行(如配置文件)。
Requires可以指定服务依赖于哪些服务(这种依赖是"强依赖",一旦所依赖的服务异常,当前的服务也随之停止)
Wants可以指定服务依赖于哪些服务(这种依赖是"弱依赖",即使所依赖的服务的启动情况不影响当前的服务是否启动)

[Install]

一般 [Install] 是在配置文件的最后一部分,是可选项。用于定义该 UNIT 的行为,一般是 enable 或者 disable 时发生调用。

[Install]描述
Alias别名,可使用systemctl command Alias.service
RequiredBy被哪些units所依赖,强依赖
WantedBy被哪些units所依赖,弱依赖
Also安装本服务的时候还要安装别的相关服务

[Service]

用于提供适用于 .service 的配置(只有 service,才需要这块)。

[Service]描述
EnvironmentFile环境配置文件,用来指定当前服务启动的环境变量
ExecStart指定服务启动时执行的命令或脚本
ExecStartPre指定服务启动前执行的命令或脚本
ExecStartPost指定服务启动后执行的命令或脚本
ExecStop指明停止服务要运行的命令或脚本
ExecStopPost指定服务停止之后执行的命令或脚本
RestartSec指定服务在重启时等待的时间,单位为秒
ExecReload指明重启服务要运行的命令或脚本
Restart当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务,具体看下列类型
PrivateTmp设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录
KillModecontrol-goup 杀掉所有进程以及子进程;process 杀死主进程; mixed 给主进程发送 sigterm,字进程sigkill;none五操作
Restartno 退出后不重启;no-success 退出编码0重启;on-failure 退出不为0重启; on-abnormal 被kill或者超时时重启;on-abort 没有捕捉到信号时重启;on-watchdog 看门狗超时时重启;always 总是重启。
Typesimple ExecStart为主进程;forking 以fork()子进程执行; oneshot执行一次;notify 启动完毕后通知systemd; idle 其他任务结束才运行

其他种类 Unit [xxx] 部分

所以本篇文章不再意义列举了,可以参考:https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

打印当前时间的服务

到这里我们已经可以开发很多种服务,挂载 systemd 上面了,那么我们就来个简单的每过 5s 打印一次当前时间的服务。

打印当前时间程序开发

在 /usr/bin/ 中新建文件 printNow.sh 进行打印:

vim /usr/bin/printNow.sh

#! /bin/bash
# Copyright◎2022, Maggot. All rights reserved.
#
# This program is print the now to screen.
# Date: 2022-11-28
# Auth: huangyichun
# Version: 0.1
date

# exit
# 更改权限
chmod 755 /usr/bin/printNow.sh

在这里插入图片描述

执行一次进行测试:

/usr/bin/printNow.sh

在这里插入图片描述

服务配置

进入到配置目录 /lib/systemd/system 中,编辑 myprint.service 文件:

cd /lib/systemd/system
vim myprint.service


[Unit]
Description=my print now
ConditionPathExists=/usr/bin/printNow.sh

[Service]
RestartSec=5s #每五秒进行一次
Type=simple
Restart=always
ExecStart=/usr/bin/printNow.sh
ExecReload=/usr/bin/printNow.sh
LimitNOFILE=102400

[Install]
WantedBy=multi-user.target

刷新 systemctl 服务

systemctl daemon-reload

查看 myprint 服务状态:

systemctl status myprint

在这里插入图片描述

启动 myprint 服务:

systemctl start myprint
systemctl status myprint

在这里插入图片描述

可以看到确实每 5s 运行了一次,但日志呢?

我们在 [Service] 中再添加(警告,centos8 可以使用):

vim /lib/systemd/system/myprint.service

# [Service] 中添加
StandardOutput=append:/tmp/myprintNow.log
StandardError=append:/tmp/myprintNow.log


systemctl daemon-reload
watch systemctl status myprint

在这里插入图片描述

这里看不到的原因是因为 restart 会清空日志。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.8 段错误,虚拟内存,内存映射 CSAPP

相信写代码的或多或少都会遇到段错误,segmentation fault. 今天终于看到这里面的底层原理 参考: https://greenhathg.github.io/2022/05/18/CMU213-CSAPP-Virtual-Memory-Systems/18-Virtual-Memory-SystemsSimple memory system exampleAddress Trans…

(转)CSS结合伪类实现icon

老规矩,还是先说说业务场景:有一个图片列表,可以添加、删除和更改,其中呢删除时设计给的设计稿时悬浮(hover)在图片上时显示删除的图标,所以就有了这个用before实现icon的场景 进入正文&#xf…

嵌入式系统开发笔记108:IO的使用方法与面向对象程序设计

文章目录前言一、IO引脚的基本概念二、映射层的设置1、映射层是原理图的直译层2、IO引脚的设置在hal.h 和 hal.cpp文件中完成(1)在hal.h中进行类定义(2)在hal.cpp中完成引脚映射三、面向对象程序设计思想1、程序设计分类2、举例3、…

DevExpress之C#界面+MATLAB动态链接库联合编程

MATLAB导出动态链接库 在MATLAB命令行中输入:deploytool,打开如下界面,选择Library Compiler 对于C#,选择.NET Assembly,点击右侧的“+”加号,添加要导出的函数 可添加多个函数 下面的类名中输入即为导出后类的名称 点击设置按钮,输入参数-C,参数的具体含义如下 …

简化MRO工业品供采交易路径,S2B2B商城助力企业构建业务一体化管理优势

在政策拉动、市场需求驱动及数字技术进步等多重力量共同作用下,近5年来,我国工业品B2B市场规模保持上升的态势。尽管2022年受疫情反复影响,但中国经济向好的局面并未改变,中国数字化经济依然会加快工业品B2B市场的发展&#xff0c…

绿色债券数据集2016-2021(含交易代码、债券简称、发行规模期限等多指标数据)

1、数据来源:wind 2、时间跨度:2016.01-2021.11年 3、区域范围:全国 4、指标说明: 部分指标如下: 交易代码 债券简称 发行起始日 缴款日 计划发行规模(亿) 发行金额上…

第四章. Pandas进阶—时间序列

第四章. Pandas进阶 4.9 时间序列 1.重采样(resample) 在Pandas中,对时间序列频率的调整称为重采样,即时间序列从一个频率转换到另一个频率的过程,由周统计变成月统计 1).语法: 4.8章 第4点 已介绍过&…

5G无线技术基础自学系列 | MIMO功能

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 无线通信的迅速发展对系统的容量和频谱…

天启星座(Tianqi)介绍

天启星座(Tianqi)由38颗卫星组网而成,提供全球短数据采集。致力于为全球物联网相关行业用户提供覆盖全球、准实时的物联网卫星数据服务,真正实现空中、海洋和地面的万物互联,构建天地一体化的卫星物联网生态系统&#…

stm32 笔记 UART读取及HAL库应用

基本流程图 由此图可知: 采用HAL库,中断方式接收串口,只有当RxXferCount 0 时,也就是调用这个函数,接收指定量的数据大小完成时,才会调用回调函数HAL_UART_RxCpltCallback()。 而且,RxXferCou…

技术资料:STM32F746NGH7,STM32L471ZGT6 IC MCU+FPU

描述:STM32F7 32 位 MCUFPU 基于高性能的 ARMCortex-M7 32 位 RISC 内核,工作频率高达 216MHz。Cortex-M7 内核具有单浮点单元(SFPU)精度,支持所有 ARM 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元(MPU&a…

ThreadLocal源码解析 2.ThreadLocalMap内核

ThreadLocal源码解析—ThreadLocalMap内核 简介 内部类 ThreadLocalMap 才是 ThreadLocal 的真正核心。 ThreadLocalMap 与 HashMap不一样,HashMap 中的数据结构有数组,链表还有红黑树;而 ThreadLocalMap 中的数据结构只有数组。HashMap 处…

反转链表与拓展【灵神基础精讲】

来源0x3f:https://space.bilibili.com/206214 文章目录反转链表[206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)[92. 反转链表 II](https://leetcode.cn/problems/reverse-linked-list-ii/)[25. K 个一组翻转链表](https://leetcode.cn/proble…

[附源码]Python计算机毕业设计Django仓储综合管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

windows改linux

使用旧的windows电脑改成linux机器,不使用双系统,直接格式化 本次需要两个U盘或者两台电脑。 制作WINPE启动盘 使用U深度制作启动盘,制作完成后进入PE系统,然后使用diskGenius删除所有电脑的分区进行快速分区,格式选…

R语言主成分回归(PCR)、 多元线性回归特征降维分析光谱数据和汽车油耗、性能数据...

原文链接:http://tecdat.cn/?p24152什么是PCR?(PCR PCA MLR)(点击文末“阅读原文”获取完整代码数据)。• PCR是处理许多 x 变量的回归技术• 给定 Y 和 X 数据:• 在 X 矩阵上进行 PCA– 定…

力扣(LeetCode)116. 填充每个节点的下一个右侧节点指针(C++)

模拟 这题可以直接操作根节点,我们保存根结点,用作最终返回值。 填充每个结点的 nextnextnext 指针,其实是树的层序遍历。由于 nextnextnext 指针的存在,我们可以做到 O(1)O(1)O(1) 的空间复杂度。 算法: 从根结点出发&#xf…

自动驾驶专题介绍 ———— 动力传动系统

文章目录动力传动系统传统动力传动系统混合动力传动系统串联型并联型串并联型纯电动传动系统电机中央驱动电动轮驱动动力传动系统 汽车动力传动系统是位于发动机和驱动车轮之间的动力传动装置,其基本功用是将发动机发出的动力传输给驱动车轮,以保障汽车在…

JavaWeb简单实例——jQuery

简单介绍: 在之后的学习中,我们会接触到Ajax异步请求,这个异步请求需要我们在网页端使用JS来发送,而使用原生的Ajax请求比较复杂,所以我们就借用一个前端框架封装后的Ajax请求,这样可以简化我们的代码编写…

大坝安全动态监管预警系统 大坝安全监测平台 遥测终端机 水位雨量监测站

平升电子大坝安全动态监管预警系统/大坝安全监测平台/大坝安全监测系统根据SL551-2012《土石坝安全监测技术规范》的整编要求,设置了变形监测、渗流监测、环境量监测。借助该系统可及时了解大坝的工作性态和水库可能存在的事故隐患,为大坝安全管理与水库…