编辑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
====== 监控结束 ======
运行成功,脚本编辑完成。