Systemd服务单元

service服务文件基本格式

service文件参数详解: https://blog.csdn.net/stone_fall/article/details/108630115

NetworkManager.service的文件示例

# 查看NetworkManager的service文件
[root@c8 ~]# cat /usr/lib/systemd/system/NetworkManager.service

[Unit]
# 定义的描述
Description=Network Manager
Documentation=man:NetworkManager(8)
# 依赖服务
Wants=network.target  
# 在network-pre.targe启动完成后启动--前置条件
After=network-pre.target dbus.service
# 本服务启动后再启动的unit--后置条件
Before=network.target network.service

[Service]
# 类型
Type=dbus
BusName=org.freedesktop.NetworkManager
# 需要加载的内容
ExecReload=/usr/bin/busctl call org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Reload u 0
#ExecReload=/bin/kill -HUP $MAINPID

# 启动前置命令
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
# 需要启动的程序
ExecStart=/usr/sbin/NetworkManager --no-daemon
Restart=on-failure
# NM doesn't want systemd to kill its children for it
# 意思是以进程方式关闭
KillMode=process
# 兼容性
CapabilityBoundingSet=CAP_NET_ADMIN CAP_DAC_OVERRIDE CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_MODULE CAP_AUDIT_WRITE CAP_KILL CAP_SYS_CHROOT
# 系统保护
ProtectSystem=true
# 保护家目录
ProtectHome=read-only
# 为服务创建一个独立的 /tmp 和 /var/tmp 目录。可以提高安全性,防止服务之间互相干扰
PrivateTmp=false

# We require file descriptors for DHCP etc. When activating many interfaces,
# the default limit of 1024 is easily reached.
LimitNOFILE=65536


[Install]
# 定义service放在哪个target里面
WantedBy=multi-user.target
# 服务的别名
Alias=dubs-org.freedesktop.NetworkManager.service
Also=NetworkManager-dispatcher.service

# We want to enable NetworkManager-wait-online.service whenever this service
# is enabled. NetworkManager-wait-online.service has
# WantedBy=network-online.target, so enabling it only has an effect if
# network-online.target itself is enabled or pulled in by some other unit.
Also=NetworkManager-wait-online.service

systemd unit存储路径

  • RHEL系列service服务文件存放在/usr/lib/systemd/system目录。
  • Debian系列service服务文件存放在/lib/systemd/system/目录下,这个目录有系统自带的服务文件和安装的软件包提供的服务文件。
  • 管理员手工创建的单元文件(service文件)建议存放在/etc/systemd/system/目录下,这样可以避免系统升级时对服务文件所做的更改被覆盖
  • 普通用户手工创建的单元文件(service文件)建议存放在/etc/lib/systemd/user/目录下
路径描述
/usr/lib/systemd/system/随安装的RPM产生的systemd units。
/run/systemd/system/在运行时创建systemd units。
/etc/systemd/system/由系统管理员创建和管理的systemd units。

自定义service文件

服务文件存放在/usr/lib/systemd/system目录

[Unit]
# 定义的描述
Description=Network Manager
# 检查文件是否可执行文件,如果不是则不启动
ConditionFileIsExecutable=/usr/bin/test.sh
[Service]
# 类型
Type=notify
# 以指定用户运行
User=user1
Group=user1
# 工作目录
#WorkingDirectory=/usr/bin/
# 指定变量
Environment=key1="value"
Environment=key2="value"
# 加载变量文件
## 文件中,每行定义一个环境变量,如 VAR=value
EnvironmentFile=-/path/to/environment
# 需要启动的程序
ExecStart=/usr/bin/test.sh &
# 服务停止时的命令
## 命令要以绝对路径执行
ExecStop=/usr/bin/killall test.sh
# 需要重载的内容
ExecReload=/bin/kill -HUP $MAINPID
# 延迟3秒启动
ExecStartPre=/bin/sleep 3
# 服务启动超时时间为60秒
TimeoutStartSec=60
# 是否自动重启
Restart=always
# 运行最大秒数(定时重启)
## 604800秒=7天
RuntimeMaxSec=604800
# 重启间隔时间
RestartSec=2s

[Install]
# 如果想要执行enable,必须写Install的内容
## 一般情况下都写multi-user.target
WantedBy=multi-user.target

systemctl定时重启

https://blog.chaos.run/dreams/systemd-unit-schedule-restart/

[Service]
# 是否自动重启
Restart=always
# 运行最大秒数(定时重启)
## 604800秒=7天
RuntimeMaxSec=604800
# 重启间隔时间
RestartSec=2s

service文件中的type

https://blog.csdn.net/Sardkit/article/details/79911925
先看看type的种类和解释:

Type类型作用
Type=simple (默认值)systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型
Type=oneshot这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idlesystemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。
Type=forkingsystemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程

从上表可以看到,当类型为forking时,systemd会认为所运行当该服务本身是守护进程即本身会fork,且只有父进程退出后systemd才会退出,但由于参考例子并不是守护进程,故systemd一直处于阻塞等待状态,默认的simple无等待这一环节。


为服务单元创建变量文件

参考:https://www.jibing57.com/2022/10/09/environment-varilables-in-systemd-service/
vim /etc/systemd/system/服务名.service

[Service]
# 指定变量
Environment=key1="value"
Environment=key2="value"
# 使用变量
ExecStart=usr/bin/my_service $key1 $key2

方法1:常用的配置方法

在etc的服务目录创建env变量文件
vim /etc/my_service/my_service.env

# 变量文件示例:
key=values
MY_SECRET=correcthorsebatterystaple
STARFLEET_SECRET=412Mark80

方法2:Debian官方推荐的方法

以 Debian 系统为例,为Service创建的变量文件路径为 /etc/systemd/system/xxx.service.d/override.conf

# 创建/etc/systemd/system/服务名.service.d目录
mkdir -p /etc/systemd/system/服务名.service.d

为debian系统的Service创建变量文件
vim /etc/systemd/system/服务名.service.d/override.conf

# 变量值
"key名1=value值1"
"key名2=value值2"

引入变量文件并使用变量

注意:引入变量文件,注意path前面有个“-”
- 在目录前,作用是忽略文件不存在
参考:https://liuzhicong.cn/index.php/guide/systemd-environment-variable.html

# 在Unit文件的[Service]中引入变量文件
# 引入变量文件,注意path前面有个“-”
EnvironmentFile=-/etc/my_service/my_service.env
ExecStart=usr/bin/my_service $MY_SECRET $STARFLEET_SECRET

在这里插入图片描述


重载并重启服务

# 重载服务
systemctl daemon-reload

# 重启containerd服务
systemctl restart containerd

查看服务单元的变量

# 查看服务单元的变量
systemctl show xxx.service |grep -i env

# 可能不管用的命令
systemctl show --property=Environment 服务名.service 

在这里插入图片描述


systemctl管理service

systemctl命令与sysvinit命令的对应关系

systemd提供systemctl命令来运行关闭重启显示启用/禁用系统服务。
systemd提供systemctl命令与sysvinit命令的功能类似

当前版本中依然兼容servicechkconfig命令,相关说明如下表, 但建议用systemctl进行系统服务管理。

sysvinit命令systemd命令备注
service network startsystemctl start network.service用来启动一个服务 (并不会重启现有的)。
service network stopsystemctl stop network.service用来停止一个服务 (并不会重启现有的)。
service network restartsystemctl restart network.service用来停止并启动一个服务。
service network reloadsystemctl reload network.service当支持时,重新装载配置文件而不中断等待操作。
service network condrestartsystemctl condrestart network.service如果服务正在运行那么重启它。
service network statussystemctl status network.service检查服务的运行状态。
chkconfig network onsystemctl enable network.service在下次启动时或满足其他触发条件时设置服务为启用。
chkconfig network offsystemctl disable network.service在下次启动时或满足其他触发条件时设置服务为禁用。
chkconfig networksystemctl is-enabled network.service用来检查一个服务在当前环境下被配置为启用还是禁用。
chkconfig \-\-listsystemctl list-unit-files \-\-type=service输出在各个运行级别下服务的启用和禁用情况。
chkconfig network \-\-listls /etc/systemd/system/*.wants/network.service用来列出该服务在哪些运行级别下启用和禁用。
chkconfig network \-\-addsystemctl daemon-reload当您创建新服务文件或者变更设置时使用。

查看服务状态

# 查看服务状态
systemctl status 服务名

相关状态显示参数说明如下表所示参数

参数描述
Loaded说明服务是否被加载,并显示服务对应的绝对路径以及是否启用。
Active说明服务是否正在运行,并显示时间节点。
Main PID相应的系统服务的PID值。
CGroup相关控制组(CGroup)的其他信息。

查看服务是否运行

# 查看服务是否运行
systemctl is-active name.service
状态含义
active(running)有一只或多只程序正在系统中执行
active(exited)仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或 者 是挂载时才会进行一次的 quotaon 功能
active(waiting)正在执行当中,不过要等待其他的事件才能继续处理。例如:打印的队列相关服务 就是 这种状态,虽然正在启动中,不过也需要真的有队列进来 (打印作业) 这样他才会继续唤 醒打印机 服务来进行下一步打印的功能
inactive这个服务没有运行

查看服务是否被启用

# 判断某个服务是否被启用
systemctl is-enabled name.service

is-enabled命令的返回结果如下:

状态含义
“enabled”已经通过 /etc/systemd/system/ 目录下的 Alias= 别名、 .wants/ 或 .requires/ 软连接被永久启用。
“enabled- runtime”已经通过 /run/systemd/system/ 目录下的 Alias= 别名、 .wants/ 或 .requires/ 软连接被临时启用。
“linked”虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软连接已经存在于 /etc/systemd/system/ 永久目录中。
“linked-runtime”虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软连接已经存在于 /run/systemd/system/ 临时目录中。
“masked”已经被 /etc/systemd/system/ 目录永久屏蔽(软连接指向 /dev/null 文件),因此 start 操作会失败。
“masked- runtime”已经被 /run/systemd/systemd/ 目录临时屏蔽(软连接指向 /dev/null 文件),因此 start 操作会失败。
“static”尚未被启用,并且单元文件的 “[Install]” 小节中没有可用于 enable 命令的选项。
“indirect”尚未被启用,但是单元文件的 “[Install]” 小节中 Also= 选项的值列表非空(也就是列表中的某些单元可能已被启用)、或者它拥有一个不在 Also= 列表中的其他名称的别名软连接。对于模版单元来说,表示已经启用了一个不同于 DefaultInstance= 的实例。
“disabled”尚未被启用,但是单元文件的 “[Install]” 小节中存在可用于 enable 命令的选项
“generated”单元文件是被单元生成器动态生成的。被生成的单元文件可能并未被直接启用,而是被单元生成器隐含的启用了。
“transient”单元文件是被运行时API动态临时生成的。该临时单元可能并未被启用。
“bad”单元文件不正确或者出现其他错误。 is-enabled 不会返回此状态,而是会显示一条出错信息。 list-unit-files 命令有可能会显示此单元。

查看服务单元的变量

# 查看服务单元的变量
systemctl show --property=Environment 服务名.service 

查看开机自启服务列表

# 查看开机自启服务列表
systemctl list-unit-files | grep enabled

# 列出所有enabled状态的服务
systemctl list-unit-files --state=enabled

在这里插入图片描述


设置开机启动

systemctlenabledisablemask子命令里面增加了--now选项,可以激活同时启动服务,激活同时停止服务等。

# 设置开机启动并现在启动
## 相当于同时执行了systemctl start 服务名
systemctl enable --now firewalld

开机启动的原理:

设置开启自启动就是把service文件/usr/lib/systemd/system/创建一个软链接/etc/systemd/system/multi-user.target.wants/;

其中[Install]字段决定了,启动服务文件链接/etc/systemd/system/的哪个target目录下.

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# systemctl enable firewalld.service 等同于软连接命令
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/multi-user.target.wants/firewalld.service'

# 查看服务状态
systemctl status firewalld

取消开机启动

# 取消开机启动并现在就停止服务
systemctl disable --now firewalld

## systemctl disable bluetooth.service原理
Removed /etc/systemd/system/bluetooth.target.wants/bluetooth.service. 
Removed /etc/systemd/system/dbus-org.bluez.service.

## 查看服务状态是否停止
systemctl status firewalld

在这里插入图片描述

# 查看启动列表
systemctl list-unit-files |grep firewalld

在这里插入图片描述


启动/暂停/重启服务

# 启动服务
systemctl start firewalld

# 停止服务
systemctl stop firewalld

# 重启服务
systemctl restart 服务名

重新加载配置

# 重新加载配置
systemctl reload 服务名

检查service是否在启动状态

写脚本时判断服务器是否启动很管用

# systemctl is-active 服务名
systemctl is-active NetworkManager

在这里插入图片描述


检测unit单元是否为自动启动

写脚本时判断服务器是否开机自启很管用

# systemctl is-enabled 服务名
systemctl is-enabled firewalld

在这里插入图片描述


注销一个服务(service)/冻结服务

systemctl mask 是注销服务的意思。
注销服务意味着:
该服务在系统重启的时候不会启动
该服务无法进行做systemctl start/stop操作
该服务无法进行systemctl enable/disable操作

# 注销服务
systemctl mask firewalld

# 注销服务并现在停止
systemctl mask --now firewalld

取消注销服务(service)/解冻服务

# 取消注销服务(service)/解冻服务
## --now 现在启动
systemctl unmask --now firewalld

显示单元的手册页(前提是由unit提供)

# 查看帮助
systemctl help

# 查看帮助
man 5 systemctl

重新载入整个systemd的系统配置并扫描unit文件的变动

# 重载改动过的服务
systemctl daemon-reload

systemctl查看类操作


查看指定服务的依赖关系

# 查看系统启动服务的依赖关系 
systemctl list-dependencies -l

在这里插入图片描述

# 查看指定服务的倚赖关系
systemctl list-dependencies sshd

在这里插入图片描述


和依赖关系

在这里插入图片描述


列出服务


列出所有已经加载的systemd units

# 列出所有已经加载的systemd units
systemctl

# 从已加载的服务中过滤服务名
systemctl | grep docker.service

查看是否存在某个服务

# 查看是否存在某个服务
systemctl --type=service|grep 服务名

列出指定状态的服务


列出活跃(active)状态的服务(运行或退出)
# 列出所有active状态(运行或退出)的服务
systemctl list-units --type=service --state=active

列出正在运行(runing)状态的服务
# 列出正在运行(runing)状态的服务
systemctl list-units --type=service --state=running

列出所有service
# 列出所有service
systemctl list-units --type=service
systemctl --type=service

# 列出所有service,包括未运行的服务
systemctl list-units --type service --all

列出所有enabled状态的服务
# 列出所有enabled状态的服务
systemctl list-unit-files --state=enabled
systemctl --state=enabled

列出所有disabled状态的服务
# 列出所有disable状态的服务
systemctl list-unit-files --state=disabled
systemctl --state=disabled

列出错误的服务/列出状态为failed的服务
# 列出错误的服务
systemctl --type service --state failed


# 列出所有正在运行或failed状态的服务
systemctl list-units --type service --state running,failed
systemctl --type service --state running,failed

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值