记录资源告警

ShellBeginner
立即练习

介绍

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 会更换目标与策略,同时沿用相同工具和函数契约。