ANALYSIS
.Shell
.基础格式
PRTCL // SHELL
#!/bin/bashecho "你好,世界!"echo "今天是:"dateecho "我是谁:"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"MY_NAME="张三"- 创建一个叫
MY_NAME的变量,值是"张三" - 注意:等号两边不能有空格!(这是 Shell 的规则)
- 创建一个叫
TODAY=$(date +%Y-%m-%d)$()的意思是:“先运行括号里的命令,把结果存下来”$取值,运行括号中的命令,然后取这个值
date +%Y-%m-%d会输出类似2025-11-27- 所以
TODAY的值就是2025-11-27
USED_MEM=$(free -m | awk '/Mem:/ {print $3}')free -m查看内存(单位 MB)awk '/Mem:/ {print $3}'是取“Mem”那一行的第 3 列(已用内存)- 结果存到
USED_MEM变量里
echo "你好,$MY_NAME!"$MY_NAME会自动替换成变量的值- 输出:
你好,张三!
.练习
- 在脚本中加一行:获取当前登录的用户名(用
whoami命令)
PRTCL // SHELL
CURRENT_USER=$(whoami)echo "当前系统用户:$CURRENT_USER"- 再加一行:获取根分区磁盘使用率(数字,不含 %)
PRTCL // SHELL
DISK_USE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')echo "根分区使用率:$DISK_USE%"💡
tr -d '%'的意思是:删除%符号,只留数字
- 样板:
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 "✅ 正常:磁盘使用率在安全范围内。"fiTHRESHOLD=80:创建变量,存阈值(注意:等号无空格)$(...):先运行括号里的命令,把结果存下来if [ ... ]; then:如果[ ]里的条件成立,就执行下面的命令-"$DISK_USE" -gt "$THRESHOLD":-gt表示 “大于”(greater than)else: 否则(条件不成立时执行)fi:if的结束标志(必须写)
💡 注意:
[ ]是判断命令,里面的变量一定要加双引号,防止空值出错。
测试
可以临时修改脚本,测试告警是否触发:
- 修改代码
PRTCL // SHELL
DISK_USE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')#修改此行代码DISK_USE=85 # 强制设为 85%- 重新运行,应该看到:
PRTCL // SHELL
当前磁盘使用率:85%警告:磁盘使用率已超过 80%!测试完改回来
练习
- 如果内存使用率 > 85%,就打印警告
PRTCL // SHELL
# 获取内存使用率(已用 / 总内存 * 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
crontab -e- 在文件中添加
PRTCL // SHELL
* * * * * /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 都是周日) |
练习
创建一个新脚本
system-summary.sh,功能:- 打印当前时间、磁盘、内存使用率
- 写入日志
~/sre-lab/logs/summary.log
设置它每 5 分钟运行一次(用于测试):
PRTCL // CRON*/5 * * * * /home/ 你的用户名 /system-summary.sh运行 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 默认只支持整数运算,所以必须使用
bc或awk这样的外部工具来进行浮点数(小数)计算。
- Bash 默认只支持整数运算,所以必须使用
else MEM_PERCENT="N/A":- 如果
$MEM_TOTAL$ 意外地为零,则将设置为"N/A"(Not Applicable),避免脚本因错误而中断。
- 如果
- 添加进入
contab
PRTCL // PLAINTEXT
#在文档末尾添加*/5 * * * * $HOME/system-summary.sh生产环境注意
- 所有路径用绝对路径:crontab 环境变量少,相对路径容易失败
- 重定向输出:建议加
>> /path/to/log 2>&1收集错误PRTCL // CRON0 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
Auth_Verified: 2026.04.06
