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
命令的功能类似
。
当前版本中依然兼容service
和chkconfig
命令,相关说明如下表, 但建议用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
设置开机启动
systemctl
在enable
、disable
、mask
子命令里面增加了--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