编辑shell脚本示例练习

发布于:2025-09-07 ⋅ 阅读:(24) ⋅ 点赞:(0)

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; then
        echo "错误:msmtp未安装,请先执行安装步骤!"
        exit 1
    fi

    if [ ! -f ~/.msmtprc ]; then
        echo "错误:邮件配置文件 ~/.msmtprc 不存在"
        echo "请按照教程配置邮件服务器"
        exit 1
    fi
}

# ======================
# 监控功能函数
# ======================


# 发送邮件报警
send_alert() {
    local subject=$1
    local 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 ]; then
        echo "邮件发送成功: $subject"
    else
        echo "邮件发送失败,请检查邮件配置"
    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 ]; then
        send_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 ]; then
        send_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 ]; then
        send_alert "磁盘报警" "磁盘空间不足:${disk_usage}% (阈值${DISK_ALERT}%)"
    fi
}

# 检查磁盘IO
check_io() {
    if ! command -v iostat &> /dev/null; then
        echo "警告:iostat命令未安装,跳过IO检查"
        return
    fi

    local 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 ]; then
        send_alert "IO报警" "磁盘IO等待过高:${io_rounded}ms (阈值${IO_ALERT}ms)"
    fi
}


# 检查网络流量
check_network() {
    if [ ! -d "/sys/class/net/$NET_IF" ]; then
        echo "错误:网络接口 $NET_IF 不存在"

                  return
    fi

    # 获取当前流量(字节)
    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/s
    local 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) )); then
        send_alert "网络报警" "下载流量过高:${rx_mbps}MB/s (阈值${NET_ALERT}MB/s)"
    fi

    if (( $(echo "$tx_mbps >= $NET_ALERT" | bc -l) )); then
        send_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_network

echo "--------------------------"
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
====== 监控结束 ======

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


网站公告

今日签到

点亮在社区的每一天
去签到