复制成功
请遵守本站许可
REPORT
Chapter_Post // Field_Report

Post_Ref: RL-SRE学习

2026.04.06

SRE学习

Echo HaoRan
Echo HaoRan
#StudyProject
ANALYSIS

.Shell#

.基础格式#

PRTCL // SHELL
#!/bin/bash
echo "你好,世界!"
echo "今天是:"
date
echo "我是谁:"
whoami
  • #!/bin/bash → 告诉系统:“请用 bash 程序来运行这个文件”(必须写在第一行)
  • echo "你好,世界!" → 在屏幕上打印一句话(echo 就是“回显”)
  • date → 运行 date 命令,显示当前时间
  • whoami → 运行 whoami 命令,显示当前用户名

.变量#

PRTCL // SHELL
#!/bin/bash
# 第一:创建一个变量,存你的用户名
MY_NAME="张三" # ← 你可以改成你的真实名字!
# 第二:让脚本“记住”当前日期
TODAY=$(date +%Y-%m-%d)
# 第三:让脚本“记住”当前用了多少内存(单位:MB)
USED_MEM=$(free -m | awk '/Mem:/ {print $3}')
# 第四:打印出来看看
echo "你好,$MY_NAME!"
echo "今天是:$TODAY"
echo "当前已用内存:$USED_MEM MB"
  1. MY_NAME="张三"

    • 创建一个叫 MY_NAME 的变量,值是 "张三"
    • 注意:等号两边不能有空格!(这是 Shell 的规则)
  2. TODAY=$(date +%Y-%m-%d)

    • $() 的意思是:“先运行括号里的命令,把结果存下来”
      • $ 取值,运行括号中的命令,然后取这个值
    • date +%Y-%m-%d 会输出类似 2025-11-27
    • 所以 TODAY 的值就是 2025-11-27
  3. USED_MEM=$(free -m | awk '/Mem:/ {print $3}')

    • free -m 查看内存(单位 MB)
    • awk '/Mem:/ {print $3}' 是取“Mem”那一行的第 3 列(已用内存)
    • 结果存到 USED_MEM 变量里
  4. echo "你好,$MY_NAME!"

    • $MY_NAME 会自动替换成变量的值
    • 输出:你好,张三!

.练习#

  1. 在脚本中加一行:获取当前登录的用户名(用 whoami 命令)
PRTCL // SHELL
Terminal window
CURRENT_USER=$(whoami)
echo "当前系统用户:$CURRENT_USER"
  1. 再加一行:获取根分区磁盘使用率(数字,不含 %)
PRTCL // SHELL
Terminal window
DISK_USE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
echo "根分区使用率:$DISK_USE%"

💡 tr -d '%' 的意思是:删除 % 符号,只留数字

  1. 样板:
PRTCL // SHELL
#!/bin/bash
CURRENT_USER=$(whoami)
MY_NAME="EchoWang"
TODAY=$(date +%Y-%m-%d)
USED_MEM=$(free -m | awk '/Mem:/ {print $3}')
DISK_USE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
echo "根分区使用率为 $DISK_USE%"
echo "当前账户为 $CURRENT_USER"
echo "hello,$MY_NAME"
echo "Today is $TODAY"
echo "Used memory is $USED_MEM MB"

.条件判断(if 语句 )#

PRTCL // BASH
#!/bin/bash
# ==============================
# 脚本:磁盘使用率检查器
# 功能:检查根分区使用率,如果超过阈值就告警
# ==============================
# 定义阈值(80%)
THRESHOLD=80
# 获取根分区磁盘使用率(只取数字,去掉 %)
# df / 输出磁盘信息,NR==2 表示取第 2 行,{print $5} 取第 5 列,tr -d '%' 删除 %
DISK_USE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
# 打印当前使用率(用于调试)
echo "当前磁盘使用率:${DISK_USE}%"
# 判断:如果使用率大于阈值,就告警
if [ "$DISK_USE" -gt "$THRESHOLD" ]; then
echo "⚠️ 警告:磁盘使用率已超过 ${THRESHOLD}%!"
else
echo "✅ 正常:磁盘使用率在安全范围内。"
fi
  • THRESHOLD=80 :创建变量,存阈值(注意:等号无空格)
  • $(...) :先运行括号里的命令,把结果存下来
  • if [ ... ]; then :如果[ ]里的条件成立,就执行下面的命令-
  • "$DISK_USE" -gt "$THRESHOLD" :-gt表示 “大于”(greater than)
  • else : 否则(条件不成立时执行)
  • fi : if 的结束标志(必须写)

💡 注意[ ] 是判断命令,里面的变量一定要加双引号,防止空值出错。

测试#

可以临时修改脚本,测试告警是否触发:

  1. 修改代码
PRTCL // SHELL
Terminal window
DISK_USE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
#修改此行代码
DISK_USE=85 # 强制设为 85%
  1. 重新运行,应该看到:
PRTCL // SHELL
Terminal window
当前磁盘使用率:85%
警告:磁盘使用率已超过 80%!

测试完改回来

练习#

  • 如果内存使用率 > 85%,就打印警告
PRTCL // SHELL
Terminal window
# 获取内存使用率(已用 / 总内存 * 100)
MEM_TOTAL=$(grep MemTotal /proc/meminfo | awk '{print $2}')
MEM_FREE=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
MEM_USED=$(( MEM_TOTAL - MEM_FREE ))
MEM_PCT=$(( MEM_USED * 100 / MEM_TOTAL ))
echo "当前内存使用率:${MEM_PCT}%"
if [ "$MEM_PCT" -gt 85 ]; then
echo "⚠️ 警告:内存使用率过高!"
else
echo "✅ 内存使用正常。"
fi

.自动化#

crontab#

  • 创建日志收集脚本
PRTCL // SHELL
#!/bin/bash
# 磁盘检查脚本(带日志记录)
LOG_FILE="$HOME/sre-lab/logs/disk-check.log"
mkdir -p "$(dirname "$LOG_FILE")"
DISK_USE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
echo "[$(date)] 磁盘使用率: ${DISK_USE}%" >> "$LOG_FILE"
if [ "$DISK_USE" -gt 80 ]; then
echo "[$(date)] ⚠️ 磁盘告警!" >> "$LOG_FILE"
fi
  • 添加进入 crontab
PRTCL // SHELL
Terminal window
crontab -e
  • 在文件中添加
PRTCL // SHELL
Terminal window
* * * * * /home/ 你的用户名 /disk-check.sh

关键说明

  • * * * * * 表示“每分钟”
  • 路径必须写绝对路径(不能写 ~/disk-check.sh
  • 如何知道你的用户名?运行 whoami
    例如:如果你的用户名是 wang,就写 /home/wang/disk-check.sh

时间格式解释

所以 0 2 * * * = 每天 2:00 AM

字段含义取值范围
第 1 个*分钟0–59
第 2 个*小时0–23
第 3 个*日期1–31
第 4 个*月份1–12
第 5 个*星期0–7(0 和 7 都是周日)

练习#

  1. 创建一个新脚本 system-summary.sh,功能:

    • 打印当前时间、磁盘、内存使用率
    • 写入日志 ~/sre-lab/logs/summary.log
  2. 设置它每 5 分钟运行一次(用于测试):

    PRTCL // CRON
    */5 * * * * /home/ 你的用户名 /system-summary.sh
  3. 运行 10 分钟后,检查日志是否每 5 分钟追加一次

  • 脚本内容
PRTCL // SHELL
#!/bin/bash
# 定义日志文件路径
LOG_FILE="$HOME/sre-lab/logs/summary.log"
LOG_DIR=$(dirname "$LOG_FILE")
# ** 重要:确保日志目录存在 **
mkdir -p "$LOG_DIR"
# 获取当前时间
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
# 获取磁盘占用率(针对根目录 /)
# df -h / 提取第二行第五列的百分比
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}')
# 获取内存使用率 ( 计算已用内存 / 总内存 * 100)
# free -m 提取第二行的已用 ($3) 和总计 ($2)
MEM_USED=$(free -m | awk 'NR==2{print $3}')
MEM_TOTAL=$(free -m | awk 'NR==2{print $2}')
# 使用 bc 进行浮点数计算
if [ "$MEM_TOTAL" -ne 0 ]; then
MEM_PERCENT=$(echo "scale=2; $MEM_USED / $MEM_TOTAL * 100" | bc)
else
MEM_PERCENT="获取错误,请检查脚本"
fi
# 格式化输出内容
SUMMARY="[${TIMESTAMP}] 磁盘占用率: ${DISK_USAGE}, 内存使用率: ${MEM_PERCENT}%"
# 写入日志文件
echo "$SUMMARY" >> "$LOG_FILE"
# 打印信息(可选,用于手动测试)
#echo "Summary recorded: $SUMMARY"
  • MEM_PERCENT=$(echo "scale=2; $MEM_USED / $MEM_TOTAL * 100" | bc):
    • scale=2: 这是 bc 的命令,指定结果的小数点后保留 2 位。
    • $MEM_USED / $MEM_TOTAL * 100: 这就是计算内存使用百分比的公式。
    • | bc: 管道符将整个数学表达式字符串传递给 bc (basic calculator) 命令。
      • Bash 默认只支持整数运算,所以必须使用 bcawk 这样的外部工具来进行浮点数(小数)计算。
    • else MEM_PERCENT="N/A":
      • 如果 $MEM_TOTAL$ 意外地为零,则将 MEMPERCENTMEM_PERCENT 设置为 "N/A" (Not Applicable),避免脚本因错误而中断。
  • 添加进入 contab
PRTCL // PLAINTEXT
#在文档末尾添加
*/5 * * * * $HOME/system-summary.sh

生产环境注意#

  • 所有路径用绝对路径:crontab 环境变量少,相对路径容易失败
  • 重定向输出:建议加 >> /path/to/log 2>&1 收集错误
    PRTCL // CRON
    0 2 * * * /home/wang/disk-check.sh >> /home/wang/sre-lab/logs/cron.log 2>&1
  • 不要频繁运行:每分钟任务慎用,避免系统负载过高
  • 信创环境注意:华为 openEuler 默认启用 crond 服务,无需额外安装
R P
Rhine Lab Pioneer Division
Auth_Verified: 2026.04.06
// END OF POST

订阅

通过 RSS 订阅本站,新文章发布时第一时间收到通知。

Follow
Classified
Chapter_06
Protocol_Ref: CC-BY-NC-SA-4.0

SRE学习

Author: CHONGXIReleased: 2026.04.06

Licensed under CC BY-NC-SA 4.0

评论

© 2025-2026 EchoSpace
Powered by Astro & echohaoran Non-Collaborative_Entity // Protocol_V.4.21