当前位置: 首页 > news >正文

编辑shell脚本示例练习

1. 目标shell脚本需求说明:


1、监控系统中的cpu、内存、硬盘、、使用率超过80%进行邮件告警(可使用邮箱163、QQ、139等)
2、监控系统中的IO await大于50进行邮件告警(可使用邮箱163、QQ、139等)
3、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警(可使用邮箱163、QQ、139等)

2. 脚本内容

#! /bin/bash# ======================
# 配置区(使用前必须修改!)
# ======================# 监控阈值设置
CPU_ALERT=80          # CPU使用率超过80%报警
MEM_ALERT=80          # 内存使用率超过80%报警
DISK_ALERT=80         # 磁盘使用率超过80%报警
IO_ALERT=50           # 磁盘IO等待超过50ms报警
NET_ALERT=10          # 网络流量超过10MB/s报警# 网络接口设置(用ifconfig命令查看)
NET_IF="ens33"# 邮件设置(使用QQ邮箱)
TO_EMAIL="136043670@qq.com"          # 接收报警的邮箱
SMTP_SERVER="smtp.qq.com"             # QQ邮箱SMTP服务器
SMTP_PASSWD="kwmwcqypzawkbgif"        #QQ邮箱提供的授权码
SMTP_PORT="587"                       # QQ邮箱端口
SMTP_USER="136043670@qq.com"         # 发件邮箱(需开通SMTP服务)# ======================
# 邮件服务器初始化检查
# ======================check_email_config() {if ! command -v msmtp &> /dev/null; thenecho "错误:msmtp未安装,请先执行安装步骤!"exit 1fiif [ ! -f ~/.msmtprc ]; thenecho "错误:邮件配置文件 ~/.msmtprc 不存在"echo "请按照教程配置邮件服务器"exit 1fi
}# ======================
# 监控功能函数
# ======================# 发送邮件报警
send_alert() {local subject=$1local message=$2# 组合邮件内容local email_content="Subject: $subject\n\n$message\n\n监控时间: $(date)"# 发送邮件echo -e "$email_content" | msmtp --from="$SMTP_USER" "$TO_EMAIL"if [ $? -eq 0 ]; thenecho "邮件发送成功: $subject"elseecho "邮件发送失败,请检查邮件配置"fi
}# 检查CPU使用率
check_cpu() {local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')local cpu_rounded=$(printf "%.0f" $cpu_usage)echo "当前CPU使用率:${cpu_rounded}%"if [ $cpu_rounded -ge $CPU_ALERT ]; thensend_alert "CPU报警" "CPU使用率过高:${cpu_rounded}% (阈值${CPU_ALERT}%)"fi
}# 检查内存使用率
check_memory() {local mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')local mem_rounded=$(printf "%.0f" $mem_usage)echo "当前内存使用率:${mem_rounded}%"if [ $mem_rounded -ge $MEM_ALERT ]; thensend_alert "内存报警" "内存使用率过高:${mem_rounded}% (阈值${MEM_ALERT}%)"fi
}# 检查磁盘空间
check_disk() {local disk_usage=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')echo "当前根分区使用率:${disk_usage}%"if [ $disk_usage -ge $DISK_ALERT ]; thensend_alert "磁盘报警" "磁盘空间不足:${disk_usage}% (阈值${DISK_ALERT}%)"fi
}# 检查磁盘IO
check_io() {if ! command -v iostat &> /dev/null; thenecho "警告:iostat命令未安装,跳过IO检查"returnfilocal io_wait=$(iostat -x | awk '/^[a-z]/ {print $10}' | head -1)local io_rounded=$(printf "%.0f" $io_wait)echo "当前磁盘IO等待:${io_rounded}ms"if [ $io_rounded -ge $IO_ALERT ]; thensend_alert "IO报警" "磁盘IO等待过高:${io_rounded}ms (阈值${IO_ALERT}ms)"fi
}# 检查网络流量
check_network() {if [ ! -d "/sys/class/net/$NET_IF" ]; thenecho "错误:网络接口 $NET_IF 不存在"returnfi# 获取当前流量(字节)local rx_bytes=$(cat /sys/class/net/$NET_IF/statistics/rx_bytes)local tx_bytes=$(cat /sys/class/net/$NET_IF/statistics/tx_bytes)# 转换为MB/slocal rx_mbps=$(echo "scale=2; $rx_bytes / 1024 / 1024" | bc)local tx_mbps=$(echo "scale=2; $tx_bytes / 1024 / 1024" | bc)echo "当前网络流量:下载 ${rx_mbps}MB/s 上传 ${tx_mbps}MB/s"if (( $(echo "$rx_mbps >= $NET_ALERT" | bc -l) )); thensend_alert "网络报警" "下载流量过高:${rx_mbps}MB/s (阈值${NET_ALERT}MB/s)"fiif (( $(echo "$tx_mbps >= $NET_ALERT" | bc -l) )); thensend_alert "网络报警" "上传流量过高:${tx_mbps}MB/s (阈值${NET_ALERT}MB/s)"fi
}# ======================
# 主程序
# ======================echo "====== 系统监控开始 ======"
echo "监控时间:$(date)"
echo "--------------------------"# 检查邮件配置
check_email_config# 执行所有监控检查
check_cpu
check_memory
check_disk
check_io
check_networkecho "--------------------------"
echo "监控完成:$(date)"
echo "====== 监控结束 ======"

3. 运行脚本

1.将脚本保存为simple_monitor.sh

2.修改脚本开头的配置参数(特别是邮箱地址)

3.给执行权限:chmod +x simple_monitor.sh

4.测试运行:./simple_monitor.sh

[root@localhost shelldemo]# ./0906zuoye.sh
====== 系统监控开始 ======
监控时间:2025年 09月 06日 星期六 22:59:41 CST
--------------------------
当前CPU使用率:25%
当前内存使用率:12%
当前根分区使用率:37%
当前磁盘IO等待:0ms
当前网络流量:下载 102.09MB/s 上传 15.67MB/s
邮件发送成功: 网络报警
邮件发送成功: 网络报警
--------------------------
监控完成:2025年 09月 06日 星期六 22:59:44 CST
====== 监控结束 ======

运行成功,脚本编辑完成。

http://www.xdnf.cn/news/1478989.html

相关文章:

  • 《sklearn机器学习——聚类性能指标》Davies-Bouldin Index (戴维斯-博尔丁指数)
  • Linux 96 shell:expect { }
  • 车载通信架构 --- DoIP企业规范中细节有哪些?
  • Huawei C 安全函数库
  • LabVIEW无线预警喷淋系统
  • 问题:指令译码前控制信号还没有产生,那么如何控制译码前指令的动作呢?
  • NV308NV309美光固态闪存NW388NW504
  • Docker部署搜索引擎SearXNG
  • (算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
  • 《云原生故障诊疗指南:从假活到配置漂移的根治方案》
  • Spark 中spark.implicits._ 中的 toDF和DataFrame 类本身的 toDF 方法
  • 【51单片机】【protues仿真】基于51单片机PM2.5空气质量检测系统
  • 云手机在企业办公中的作用
  • [论文阅读] 软件工程 - 需求工程 | 2012-2019年移动应用需求工程研究趋势:需求分析成焦点,数据源却藏着大问题?
  • Linux内核网络子系统框架介绍
  • STM32----W25QXX
  • Long-VLA:释放机器人长范围操作视觉-语言-动作模型的能力
  • 【HEMCO Reference Guide 参考指南第二期】配置文件的结构和语法
  • 贪心算法应用:3D打印支撑结构问题详解
  • 大语言模型预训练数据采集与清洗技术实践:从语料到知识库的全流程优化
  • Qt对话框与文件操作学习
  • Transformer 架构的演进与未来方向(RNN → Self-Attention → Mamba)——李宏毅大模型2025第四讲笔记
  • 如何快速屏蔽红黄区偷偷上互联网呢
  • 为什么服务器有主备BMC?
  • Maven的介绍及基本使用
  • Springboot集成minio实现文件上传与下载
  • Go基础(②Viper)
  • 安装MATLAB205软件记录
  • 【Linux】Linux环境基础开发工具使用
  • clang(clangd)与arm-linux-gcc、ARMGCC、ICCARM(IAR)、C51编译器的兼容性