systemd 目标与服务管理
100%

初始化 · 第 6 课

systemd 目标与服务管理

学习如何检查、覆盖、验证、启动、启用 systemd 服务单元并排查故障。

systemctl 向 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,在取消屏蔽前阻止普通激活,包括依赖关系触发的激活。它比禁用更强,并可能破坏依赖该单元的其他单元;使用前应检查反向依赖关系。

对已在运行的服务执行不带 --nowsystemctl disable UNIT 后,会发生什么?

验证服务结果

做出更改后,应检查进程状态、最近的日志、监听端点、依赖单元和应用程序健康状况;如果修改了启动时的启用状态,还应通过一次受控重启检查其行为。可根据情况使用 systemctl is-failedsystemctl list-dependencies 和应用程序自身的检查工具。

课程已完成

你已完成 systemd 目标与服务管理

现在,你可以在不混淆配置、运行时状态和启用状态的情况下管理 systemd 服务。

  • 按照各自不同的职责理解 [Unit][Service][Install]

  • 对比已加载单元的状态与已安装单元文件的状态。

  • 使用插入式配置,并在外部文件发生变化后重新加载管理器。

  • 只有在评估影响后,才启动、停止、重新加载或重启服务。

  • 将启用、禁用和屏蔽视为不同的持久性控制手段。

保存学习进度

创建免费账户即可保存本课进度,并在任意设备上继续学习。

创建免费账户
下一节
返回 初始化