管理服务与系统日志

LinuxBeginner
立即练习

简介

进程是正在运行的程序。服务是按照定义和生命周期策略进行管理、能够长期运行的系统功能。在 Ubuntu 中,systemd 会读取单元定义,启动和停止服务,跟踪服务状态,并将服务输出记录到系统日志中。

在本实验中,你将使用一个隔离的 labex-heartbeat 练习服务。你将检查其单元、控制运行状态、配置开机启用、查询 journal 和传统文本日志、跟踪实时输出、诊断一个受控故障,并恢复服务的正常运行。你不需要编辑单元文件,也不会接触 SSH 服务。

识别 systemd 与服务单元

在本步骤中,你将确认 systemd 可用,并区分正在运行的单元和已安装的单元文件。

进入实验工作区:

cd /home/labex/project/service-lab

显示 systemd 版本。显示第一行即可完成识别:

systemctl --version | head -n 1

查看 systemd 的整体状态:

systemctl is-system-running || true

running 表示所有必需的单元都处于正常状态。培训虚拟机可能会报告 degraded,原因是某个无关的可选单元发生了故障;但该命令仍能证明 systemd 正在响应。

列出当前正在运行的部分服务:

systemctl list-units --type=service --state=running --no-pager | head -n 12

单元是由 systemd 管理的对象。服务单元以 .service 结尾。单元文件描述了可以被管理的对象,即使它当前没有运行:

systemctl list-unit-files --type=service --no-pager | head -n 12

保存一份简要的 systemd 摘要。命令替换 $(...) 会将命令输出插入 printf 要写入的文本中:

printf 'systemd=%s\nstate=%s\n' "$(systemctl --version | head -n 1)" "$(systemctl is-system-running)" > systemd-summary.txt
cat systemd-summary.txt

检查服务定义与状态

在本步骤中,你将先检查准备好的练习服务,然后再启动它。

systemctl status 会汇总已加载的单元路径、启用状态、运行状态、进程信息以及最近的日志行:

cd /home/labex/project/service-lab
systemctl status labex-heartbeat.service --no-pager

服务应显示为 inactive (dead),并且处于 disabled 状态。inactive 表示服务当前未运行;disabled 表示服务未配置为在开机时通过其安装目标自动启动。这两个属性彼此独立。

显示单元定义:

systemctl cat labex-heartbeat.service

[Unit] 部分描述服务的标识和启动顺序,[Service] 定义要运行的进程,[Install] 描述启用配置。你只需检查这个准备好的单元,无需自行编写。

使用 systemctl show 查看适合程序处理的属性:

systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState

保存这些属性以便验证:

systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState > service-properties.txt
cat service-properties.txt

启动、停止和重启服务

在本步骤中,你将更改练习服务的运行状态,并确认每次操作的结果。

启动和停止系统服务需要提升权限。启动服务:

sudo systemctl start labex-heartbeat.service

检查简洁的活动状态:

systemctl is-active labex-heartbeat.service

预期输出为 active。查看更完整的状态:

systemctl status labex-heartbeat.service --no-pager

此时状态中应包含主进程 PID。停止服务并检查结果:

sudo systemctl stop labex-heartbeat.service
systemctl is-active labex-heartbeat.service || true

预期状态为 inactive。再次启动服务,然后使用 restart 在一次操作中替换正在运行的进程:

sudo systemctl start labex-heartbeat.service
sudo systemctl restart labex-heartbeat.service
systemctl show labex-heartbeat.service -p ActiveState -p SubState -p MainPID

完成本步骤时,服务应处于 ActiveState=activeSubState=running 状态。

配置开机启用

在本步骤中,你将区分服务当前的运行状态,以及它是否已配置为在之后的系统启动时自动运行。

服务在上一步中处于活动状态,但实验环境将其单元文件保持为禁用状态。检查启用状态:

systemctl is-enabled labex-heartbeat.service || true

启用服务:

sudo systemctl enable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service

启用操作会创建链接,将服务连接到某个启动目标。它不会重启已经运行的服务。

练习移除这些开机启动链接:

sudo systemctl disable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service || true

即使输出现在为 disabled,服务仍可以保持运行。为了让实验最终处于正确状态,请重新启用服务:

sudo systemctl enable labex-heartbeat.service

确认这两个相互独立的属性:

systemctl is-active labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service

使用 journalctl 查询服务日志

在本步骤中,你将从 systemd journal 中读取服务的近期输出,并保存一份聚焦于该服务的日志快照。

由 systemd 管理的服务通常会将标准输出和标准错误发送到 journal。仅查询这个练习单元:

sudo journalctl -u labex-heartbeat.service -n 10 --no-pager

-u 选项用于选择单元,-n 10 保留最近的 10 条记录,--no-pager 则直接输出结果。你应该能看到服务启动消息和心跳记录。

将结果限制在最近的一段时间内:

sudo journalctl -u labex-heartbeat.service --since "5 minutes ago" --no-pager

筛选警告级别或更高优先级的日志。如果服务没有记录警告,则没有输出也是正常且有效的结果:

sudo journalctl -u labex-heartbeat.service -p warning --since "5 minutes ago" --no-pager

将该单元最近的日志快照保存到项目工作区:

cd /home/labex/project/service-lab
sudo journalctl -u labex-heartbeat.service -n 20 --no-pager > service-journal.txt
tail -n 5 service-journal.txt

跟踪传统文本日志

在本步骤中,你将检查 /var/log,并跟踪一个会不断产生新记录的文本日志文件。

/var/log 目录层级保存了许多传统系统日志和应用日志。列出其中的一小部分:

ls -lh /var/log | head -n 12

读取练习服务的最新记录:

tail -n 5 /var/log/labex-heartbeat.log

-f 选项会持续跟踪文件,并在其他进程追加内容时显示新行:

tail -f /var/log/labex-heartbeat.log

等待看到至少两行新的心跳记录,然后按下 Ctrl+C。这只会中断 tail,不会停止正在写入日志的服务。

筛选心跳记录,并查看最近的 3 行:

grep '^heartbeat ' /var/log/labex-heartbeat.log | tail -n 3

将 5 行样本保存到项目工作区:

cd /home/labex/project/service-lab
tail -n 5 /var/log/labex-heartbeat.log > traditional-log-sample.txt
cat traditional-log-sample.txt

诊断并恢复故障服务

在本步骤中,你将制造一个受控的配置故障,利用服务状态和日志定位问题,然后恢复服务的正常运行。

停止练习服务,并备份其简单配置文件:

sudo systemctl stop labex-heartbeat.service
sudo cp /etc/labex-heartbeat.conf /etc/labex-heartbeat.conf.bak

将数字间隔替换为无效值。此操作只会故意破坏练习服务:

sudo sed -i 's/^INTERVAL=2$/INTERVAL=invalid/' /etc/labex-heartbeat.conf

尝试启动服务。预期会显示失败消息:

sudo systemctl start labex-heartbeat.service || true

检查失败状态:

systemctl status labex-heartbeat.service --no-pager || true
systemctl is-failed labex-heartbeat.service

状态信息会告诉你进程已经退出,而 journal 会提供应用层面的具体原因:

sudo journalctl -u labex-heartbeat.service -n 10 --no-pager

查找 configuration error: INTERVAL must be a positive integer。恢复已知正常的配置,清除记录的失败状态,然后再次启动服务:

sudo mv /etc/labex-heartbeat.conf.bak /etc/labex-heartbeat.conf
sudo systemctl reset-failed labex-heartbeat.service
sudo systemctl start labex-heartbeat.service

确认服务已恢复:

systemctl is-active labex-heartbeat.service
cat /etc/labex-heartbeat.conf

服务应处于 active 状态,配置中也应重新包含 INTERVAL=2

总结

你已经区分了进程、服务、活动状态和开机启用配置。你检查了 systemd 单元,使用 systemctl 控制了一个安全的练习服务,并使用 journalctl 查询了相关记录。

你还检查了 /var/log,使用 tail -f 跟踪实时文本输出,将状态与日志结合起来分析受控故障,并恢复了服务。这种先查看状态、再检查日志的工作方式,是初学者进行服务故障排查的重要基础。