简介
进程是正在运行的程序。服务是按照定义和生命周期策略进行管理、能够长期运行的系统功能。在 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=active 和 SubState=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 跟踪实时文本输出,将状态与日志结合起来分析受控故障,并恢复了服务。这种先查看状态、再检查日志的工作方式,是初学者进行服务故障排查的重要基础。



