Systemd服务单元

Systemd服务单元

  • service服务文件基本格式
    • 自定义service文件
    • systemctl定时重启
    • service文件中的type
  • systemctl管理service
    • 查看服务状态
      • 查看服务是否运行
      • 查看服务是否被启用
    • 查看开机自启服务列表
    • 设置开机启动
      • 开机启动的原理:
    • 取消开机启动
    • 启动/暂停/重启服务
    • 重新加载配置
    • 检查service是否在启动状态
    • 检测unit单元是否为自动启动
    • 注销一个服务(service)/冻结服务
    • 取消注销服务(service)/解冻服务
    • 显示单元的手册页(前提是由unit提供)
    • 重新载入整个systemd的系统配置并扫描unit文件的变动
  • systemctl查看类操作
    • 查看指定服务的依赖关系
      • 和依赖关系
    • 列出服务
      • 列出所有已经加载的systemd `units`
      • 查看是否存在某个服务
      • `列出`指定状态的`服务`
        • 列出活跃(`active`)状态的服务(运行或退出)
        • 列出正在运行(`runing`)状态的服务
        • 列出所有service
        • 列出所有`enabled`状态的服务
        • 列出所有`disabled`状态的服务
        • 列出错误的服务/列出状态为`failed`的服务

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

# 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

自定义service文件

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

[Unit]
# 定义的描述
Description=Network Manager
# 检查文件是否可执行文件,如果不是则不启动
ConditionFileIsExecutable=/usr/bin/test.sh
[Service]
# 类型
Type=notify
# 以指定用户运行
User=user1
Group=user1
# 工作目录
#WorkingDirectory=/usr/bin/
# 需要启动的程序
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=idle systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。
Type=forking systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程

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


systemctl管理service

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

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

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

sysvinit命令 systemd命令 备注
service network start systemctl start network.service 用来启动一个服务 (并不会重启现有的)。
service network stop systemctl stop network.service 用来停止一个服务 (并不会重启现有的)。
service network restart systemctl restart network.service 用来停止并启动一个服务。
service network reload systemctl reload network.service 当支持时,重新装载配置文件而不中断等待操作。
service network condrestart systemctl condrestart network.service 如果服务正在运行那么重启它。
service network status systemctl status network.service 检查服务的运行状态。
chkconfig network on systemctl enable network.service 在下次启动时或满足其他触发条件时设置服务为启用。
chkconfig network off systemctl disable network.service 在下次启动时或满足其他触发条件时设置服务为禁用。
chkconfig network systemctl is-enabled network.service 用来检查一个服务在当前环境下被配置为启用还是禁用。
chkconfig \-\-list systemctl list-unit-files \-\-type=service 输出在各个运行级别下服务的启用和禁用情况。
chkconfig network \-\-list ls /etc/systemd/system/*.wants/network.service 用来列出该服务在哪些运行级别下启用和禁用。
chkconfig network \-\-add systemctl 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 list-unit-files | grep enabled

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

Systemd服务单元_第1张图片


设置开机启动

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

Systemd服务单元_第2张图片


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

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

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

Systemd服务单元_第3张图片


注销一个服务(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

Systemd服务单元_第4张图片

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


和依赖关系

Systemd服务单元_第5张图片


列出服务


列出所有已经加载的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

你可能感兴趣的:(Systemd,服务单元,service)