介绍
FRAME Studio 现在需要保留一段工作过程的记录,而不是会消失的终端显示。本独立实例已经完成资源采样工具。你的工作是把观测结果转换为明确的告警,并追加记录,保留操作员原有历史。
你将实现三个简短函数:判断单个读数、记录完整行、重复执行预备采样动作。前置要求是 Bash 变量、函数、条件与循环;第一项 Guided Lab 解释了指标含义。不需要其文件。阈值是本地教学策略,不是通用生产建议。时长为作者估计。
为每个读数给出明确状态
本步骤把一个百分比及其阈值转换为可复用的告警判断。
从 Terminal 开始。本独立实例已包含可用的 metrics.sh,不需要上一实验的文件。进入工作目录:
cd /home/labex/project/resource-watch
查看当前观测:
bash snapshot.sh
四个制表符分隔的字段依次是 UTC 时间戳、CPU 非空闲、内存压力和目标文件系统使用率。它们描述当前实例,不是生产机群。资源告警不能证明照片导出已经失败。
cat 显示策略,不会修改它:
cat policy.sh
阅读三个阈值以及完整的目标、日志路径。本单元 CPU 和内存阈值为 80,磁盘阈值为 50。这些是教学选择。明确规则为读数大于或等于自身阈值时输出 WARN,否则输出 OK。等号边界很重要。保留提供的策略与采样程序。
用 nano 打开未完成的函数:
本实验重新提供了已经可用的指标函数文件。请编辑下一条命令指定的监控函数文件,不要把前一个实验的指标文件复制到此实例。策略输出中的三个 LIMIT 值都是整数百分比,TARGET 是观测目录,LOG 是历史保存路径。读取策略不会修改它。
nano monitor-functions.sh
只把 classify 替换为:
classify() {
if (( $1 >= $2 )); then
echo WARN
else
echo OK
fi
}
第一个参数是读数,第二个是阈值。((...)) 比较数值;>= 包含相等情况。两个分支都打印状态,因此正常读数明确显示 OK,而不是保持沉默。按 Ctrl+O、Enter、Ctrl+X 保存。
source 加载定义。由于交互 shell 是 Zsh,用 bash -c 执行测试。单引号为 Bash 保留内部命令:
bash -c 'source ./monitor-functions.sh; classify 79 80; classify 80 80; classify 81 80'
OK
WARN
WARN
这些给定读数用于检验规则,并非当前 CPU 测量值。即使今天机器恰好处于某种状态,永远输出 WARN 或永远输出 OK 的函数仍然错误。
追加完整的监控记录
本步骤记录全部读数及其各自状态,不覆盖原有历史。
保持在 Terminal,目录为 /home/labex/project/resource-watch。先阅读操作员的已有历史:
cat history.tsv
原始行必须逐字节保留在开头。history.tsv 是实际交付物,不是手工填写的报告。每条新行有七个制表符分隔的字段:UTC 时间戳、CPU、内存、磁盘,然后依次是 CPU、内存、磁盘状态。
打开函数文件:
nano monitor-functions.sh
只把 record_sample 替换为:
record_sample() {
local stamp=$1 cpu=$2 memory=$3 disk=$4 logfile=$5
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
"$stamp" "$cpu" "$memory" "$disk" \
"$(classify "$cpu" "$CPU_LIMIT")" \
"$(classify "$memory" "$MEMORY_LIMIT")" \
"$(classify "$disk" "$DISK_LIMIT")" >> "$logfile"
}
printf 替换各个 %s,\t 写入制表符,\n 结束该行。代码行末的反斜杠表示同一命令在下一行继续。$(...) 捕获函数输出。双引号保留每个捕获值,也保留包含空格的日志路径。>> 追加;此处用 > 会破坏已有记录。按 Ctrl+O、Enter、Ctrl+X 保存。
在单独的练习文件中尝试一条给定测试记录。source ./policy.sh 把阈值变量加载到当前 Bash 进程。它们不会自动保留到另一终端或下一次 bash -c 调用。
bash -c 'source ./policy.sh; source ./monitor-functions.sh; record_sample 2026-01-02T03:04:05Z 10 85 20 practice.tsv'
cat practice.tsv
2026-01-02T03:04:05Z 10 85 20 OK WARN OK
内存告警来自 85 与 80 的比较,不会让另外两个状态也变成 WARN。重复练习会再追加一条练习记录。不要把示例读数追加到 history.tsv;它只用于真实采样。
用练习示例从左到右理解七个字段:
| 字段 | 示例 | 含义 |
|---|---|---|
| 1 | 2026-01-02T03:04:05Z | UTC 时间,Z 表示 UTC |
| 2 | 10 | CPU 非空闲百分比 |
| 3 | 85 | 内存压力百分比 |
| 4 | 20 | 目标文件系统使用百分比 |
| 5 | OK | CPU 10 低于自身阈值 80 |
| 6 | WARN | 内存 85 达到或超过自身阈值 80 |
| 7 | OK | 磁盘 20 低于自身阈值 50 |
Terminal 中的制表符可能看起来像宽度不一的空格。请保留函数产生的真实制表符,不要用空格手动对齐正式历史。原来的操作员记录是预置背景,因此日期较早是正常的。这个给定示例只写入独立的练习文件。
限定采样次数并保留历史
本步骤重复真实采样,查看保存结果,并再次运行而不丢失进度。
保持在 Terminal,目录为 /home/labex/project/resource-watch。提供的 monitor.sh 定义了 capture_once target logfile:它取得一个新观测,调用记录函数,并显示已保存的那一行。你的循环必须原样传递目标与日志路径,严格调用指定次数。每次采集包含一个新的一秒 CPU 区间;这是有限次数的监控,不是精确调度器。
nano monitor-functions.sh
只把 run_monitor 替换为:
run_monitor() {
local count=$1 target=$2 logfile=$3
local n
for ((n = 0; n < count; n++)); do
capture_once "$target" "$logfile"
done
}
算术循环从零开始,在 n 小于 count 时继续,每次采样后递增 n。引号保留两个路径。行为相同的 while 循环也有效。按 Ctrl+O、Enter、Ctrl+X 保存。
进行三次真实采样:
bash monitor.sh 3
应先输出三条新记录,再返回提示符。每行的 UTC 时间戳应比上一行更晚。真实读数会变化,正常运行可能没有告警。预备驱动接受 1 到 30 的次数。较长监测中可按 Ctrl+C 停止前台脚本;已追加的记录保留。不需要终止其他进程。
阅读结果并计数。wc -l 统计以换行符结束的行:
cat history.tsv
wc -l history.tsv
首次按文档执行后,应有原始行加三条新行,共四行。如果已经多采了几次,数量会更大。保留这些有效观测。
现在再监测一次:
bash monitor.sh 1
wc -l history.tsv
行数增加一。记录函数采用追加而不是覆盖,因此再次运行是安全的。用 policy.sh 中对应阈值逐一核对状态与读数。
接下来故意尝试一个普通输入错误:次数为零会在采样前被拒绝。
bash monitor.sh 0
Use a sample count from 1 to 30.
这条预期失败命令以状态 2 退出,历史不变。用有效次数恢复,不要重置 VM 或编辑日志:
bash monitor.sh 1
会再追加一条新行。预备采样程序也会拒绝不完整的指标输出,不会追加看似合理的空观测。
检查结果
- 原操作员记录仍在开头,后面是新增观测。
- 首次运行追加三行,继续采样一次再追加一行。重复命令产生更多有效行也是允许的。
- 先读三个百分比,再逐一比较各自阈值。三个状态都是 OK 也正确,不必制造负载或删除文件来触发告警。
- 每次采样都会等待新的 CPU 测量区间,短暂停顿正常。采样时不要反复按 Enter。提示符返回表示这次有界运行结束。关闭 Terminal 不会让它变成持续运行的监控服务。
总结
你实现了包含相等边界的告警规则,追加了带三个独立状态的完整记录,并在保留已有历史的同时重复真实采样。现在可以运行短时监控、阅读证据并继续记录。独立 Challenge 会更换目标与策略,同时沿用相同工具和函数契约。



