systemctl 向 systemd 管理器发送请求。本课重点介绍系统服务单元。改变状态之前,应确认确切的单元名称、管理器作用域、依赖关系和操作影响。
初始化 · 第 6 课
systemd 目标与服务管理
学习如何检查、覆盖、验证、启动、启用 systemd 服务单元并排查故障。
阅读服务单元
下面是一个用于说明的最小单元:
[Unit]
Description=Example worker
Wants=network-online.target
After=network-online.target
[Service]
Type=exec
ExecStart=/usr/local/bin/example-worker
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit]包含描述和依赖关系。[Service]定义进程生命周期和服务特有的行为。[Install]告诉启用命令要创建哪些别名或依赖链接;它不会自动成为活动的运行时依赖关系。
默认情况下,ExecStart= 不会交给 shell 执行。除非有意显式调用 shell,否则 shell 管道、重定向、变量和引号的行为与交互式命令行不同。
WantedBy= 等 [Install] 指令的主要用途是什么?
检查生效的配置
列出已加载的单元:
$ systemctl list-units --type=service
列出已安装的单元文件及其启用状态:
$ systemctl list-unit-files --type=service
两条命令展示的视角不同:单元文件可能已启用但未活动、已活动但未启用,也可能是静态、生成、临时、已屏蔽状态,或没有出现在其中某个列表里。用以下命令检查合并后的厂商配置和插入式配置:
$ systemctl cat UNIT.service
$ systemctl show UNIT.service
list-unit-files 会显示哪项并非 list-units 主要展示的信息?
创建本地覆盖配置
应使用插入式配置,而不是编辑软件包提供的单元:
$ sudo systemctl edit UNIT.service
在当前实现中,保存后 systemctl 通常会在该编辑流程中要求管理器重新加载配置;但如果通过其他方式修改文件,则应运行:
$ sudo systemctl daemon-reload
daemon-reload 会重新读取单元定义并重建依赖关系。它不会重新加载应用程序配置,也不会重启正在运行的服务。适当时可用 systemd-analyze verify 验证单元语法和依赖关系,然后检查合并后实际生效的单元。
systemctl daemon-reload 会做什么?
服务的运行时状态
验证服务配置并保留恢复通道后,可执行:
$ sudo systemctl start peanut.service
$ sudo systemctl stop peanut.service
$ sudo systemctl restart peanut.service
$ sudo systemctl reload peanut.service
只有单元定义或支持重新加载操作时,reload 才会成功。restart 会中断进程,而且可能无法恢复服务。操作远程访问、网络、存储或身份验证服务时,应保留独立的控制台通道,并在执行前验证配置。
用以下命令检查状态和日志:
$ systemctl status peanut.service
$ systemctl is-active peanut.service
$ journalctl -u peanut.service -b
“活动”只是管理器状态,不能证明每个应用端点都健康。
哪个命令会立即启动 peanut.service,但本身不改变其未来的启用状态?
启用、禁用与屏蔽
用以下命令管理未来的依赖链接:
$ sudo systemctl enable peanut.service
$ sudo systemctl disable peanut.service
除非添加 --now,否则 enable 不会启动单元,disable 也不会停止正在运行的单元。静态单元即使没有安装元数据,也仍可作为另一个单元的依赖项被激活。
屏蔽操作会将单元链接到 /dev/null,在取消屏蔽前阻止普通激活,包括依赖关系触发的激活。它比禁用更强,并可能破坏依赖该单元的其他单元;使用前应检查反向依赖关系。
对已在运行的服务执行不带 --now 的 systemctl disable UNIT 后,会发生什么?
验证服务结果
做出更改后,应检查进程状态、最近的日志、监听端点、依赖单元和应用程序健康状况;如果修改了启动时的启用状态,还应通过一次受控重启检查其行为。可根据情况使用 systemctl is-failed、systemctl list-dependencies 和应用程序自身的检查工具。
课程已完成
你已完成 systemd 目标与服务管理
现在,你可以在不混淆配置、运行时状态和启用状态的情况下管理 systemd 服务。
按照各自不同的职责理解
[Unit]、[Service]和[Install]。对比已加载单元的状态与已安装单元文件的状态。
使用插入式配置,并在外部文件发生变化后重新加载管理器。
只有在评估影响后,才启动、停止、重新加载或重启服务。
将启用、禁用和屏蔽视为不同的持久性控制手段。