1. Shell脚本内容
#!/bin/bash
# 监控配置
CPU_THRESHOLD=80 # CPU使用率阈值(%)
MEMORY_THRESHOLD=80 # 内存使用率阈值(%)
DISK_THRESHOLD=80 # 磁盘使用率阈值(%)
IO_AWAIT_THRESHOLD=50 # IO await阈值
NETWORK_THRESHOLD=10 # 网络流量阈值(MB/s)
CHECK_INTERVAL=60 # 检查间隔(秒)
# 邮件配置 - 请根据实际情况修改
SMTP_SERVER="smtp.126.com" # 邮件服务器,如smtp.qq.com, smtp.139.com
SMTP_PORT="25" # 邮件服务器端口,通常25或465
SMTP_USER="your_email@126.com" # 发件人邮箱
SMTP_PASS="your_password" # 发件人密码/授权码
RECIPIENT="recipient@example.com" # 收件人邮箱
SUBJECT_PREFIX="[系统告警] " # 邮件主题前缀
# 临时文件
TMP_DIR="/tmp/system_monitor"
mkdir -p $TMP_DIR
CPU_TMP="$TMP_DIR/cpu.tmp"
MEMORY_TMP="$TMP_DIR/memory.tmp"
DISK_TMP="$TMP_DIR/disk.tmp"
IO_TMP="$TMP_DIR/io.tmp"
NET_TMP_1="$TMP_DIR/net1.tmp"
NET_TMP_2="$TMP_DIR/net2.tmp"
# 发送邮件函数
send_alert() {
local subject="$1"
local message="$2"
echo -e "Subject:$SUBJECT_PREFIX$subject\nTo:$RECIPIENT\nFrom:$SMTP_USER\n\n$message" | \
sendmail -S "$SMTP_SERVER:$SMTP_PORT" -au"$SMTP_USER" -ap"$SMTP_PASS" $RECIPIENT
if [ $? -eq 0 ]; then
echo "告警邮件已发送: $subject"
else
echo "邮件发送失败: $subject"
fi
}
# 监控CPU使用率
monitor_cpu() {
local cpu_usage=$(top -b -n 1 | grep "Cpu(s)" | awk '{print $2 + $4}')
local cpu_usage_int=$(echo "$cpu_usage" | cut -d '.' -f 1)
echo "CPU使用率: $cpu_usage%"
if [ $cpu_usage_int -ge $CPU_THRESHOLD ]; then
local message="CPU使用率超过阈值($CPU_THRESHOLD%)\n当前使用率: $cpu_usage%"
send_alert "CPU使用率过高" "$message"
fi
}
# 监控内存使用率
monitor_memory() {
local mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
local mem_usage_int=$(echo "$mem_usage" | cut -d '.' -f 1)
echo "内存使用率: $mem_usage%"
if [ $mem_usage_int -ge $MEMORY_THRESHOLD ]; then
local message="内存使用率超过阈值($MEMORY_THRESHOLD%)\n当前使用率: $mem_usage%"
send_alert "内存使用率过高" "$message"
fi
}
# 监控磁盘使用率
monitor_disk() {
local disk_usage=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
echo "磁盘使用率: $disk_usage%"
if [ $disk_usage -ge $DISK_THRESHOLD ]; then
local message="磁盘使用率超过阈值($DISK_THRESHOLD%)\n当前使用率: $disk_usage%"
send_alert "磁盘使用率过高" "$message"
fi
}
# 监控IO await
monitor_io() {
local io_await=$(iostat -x | grep -v "Device" | awk '{print $10}' | sort -nr | head -1)
local io_await_int=$(echo "$io_await" | cut -d '.' -f 1)
echo "IO await: $io_await"
if [ $io_await_int -ge $IO_AWAIT_THRESHOLD ]; then
local message="IO await超过阈值($IO_AWAIT_THRESHOLD)\n当前值: $io_await"
send_alert "IO性能异常" "$message"
fi
}
# 监控网络流量
monitor_network() {
# 获取第一次网络统计
cat /proc/net/dev | grep -v "lo" | grep -v "Inter" > $NET_TMP_1
sleep 1
# 获取第二次网络统计
cat /proc/net/dev | grep -v "lo" | grep -v "Inter" > $NET_TMP_2
# 计算每个接口的流量
while read -r interface rx1 tx1; do
# 从第二次统计中获取对应接口的数据
rx2=$(grep "$interface" $NET_TMP_2 | awk '{print $2}')
tx2=$(grep "$interface" $NET_TMP_2 | awk '{print $10}')
# 计算差值(字节)
rx_diff=$((rx2 - rx1))
tx_diff=$((tx2 - tx1))
# 转换为MB/s (1 MB = 1024 * 1024 bytes)
rx_mb=$(echo "scale=2; $rx_diff / 1024 / 1024" | bc)
tx_mb=$(echo "scale=2; $tx_diff / 1024 / 1024" | bc)
echo "网络接口 $interface: 下载 $rx_mb MB/s, 上传 $tx_mb MB/s"
# 检查下载是否超过阈值
rx_compare=$(echo "$rx_mb > $NETWORK_THRESHOLD" | bc)
if [ $rx_compare -eq 1 ]; then
local message="网络下载流量超过阈值($NETWORK_THRESHOLD MB/s)\n接口: $interface\n当前下载速度: $rx_mb MB/s"
send_alert "网络下载流量过高" "$message"
fi
# 检查上传是否超过阈值
tx_compare=$(echo "$tx_mb > $NETWORK_THRESHOLD" | bc)
if [ $tx_compare -eq 1 ]; then
local message="网络上传流量超过阈值($NETWORK_THRESHOLD MB/s)\n接口: $interface\n当前上传速度: $tx_mb MB/s"
send_alert "网络上传流量过高" "$message"
fi
done < <(awk '{print $1, $2, $10}' $NET_TMP_1)
}
# 主监控函数
main_monitor() {
echo "===== 开始系统监控 ====="
echo "监控时间: $(date)"
monitor_cpu
monitor_memory
monitor_disk
monitor_io
monitor_network
echo "===== 监控结束 ====="
echo
}
# 检查是否安装了必要工具
check_dependencies() {
local dependencies=("sendmail" "bc" "iostat" "top" "free" "df")
local missing=0
for dep in "${dependencies[@]}"; do
if ! command -v $dep &> /dev/null; then
echo "错误: 未安装必要工具 $dep"
missing=1
fi
done
if [ $missing -eq 1 ]; then
echo "请先安装缺失的工具再运行脚本"
exit 1
fi
}
# 显示帮助信息
show_help() {
echo "系统资源监控脚本"
echo "用法: $0 [选项]"
echo "选项:"
echo " -h, --help 显示帮助信息"
echo " -o, --once 仅执行一次监控"
echo " -i, --interval 指定监控间隔(秒), 默认60秒"
echo
echo "配置说明:"
echo " 请先修改脚本中的邮件配置信息"
echo " 可调整脚本开头的阈值参数"
}
# 解析命令行参数
run_once=0
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
show_help
exit 0
;;
-o|--once)
run_once=1
shift
;;
-i|--interval)
CHECK_INTERVAL="$2"
shift 2
;;
*)
echo "未知选项: $1"
show_help
exit 1
;;
esac
done
# 检查依赖
check_dependencies
# 运行监控
if [ $run_once -eq 1 ]; then
main_monitor
else
while true; do
main_monitor
sleep $CHECK_INTERVAL
done
fi
# 清理临时文件
rm -rf $TMP_DIR
2. 脚本使用说明
-
配置修改:使用前需要修改脚本中的邮件配置部分:
SMTP_SERVER:根据您使用的邮箱选择对应的 SMTP 服务器SMTP_USER:发件人邮箱地址SMTP_PASS:邮箱密码或授权码(部分邮箱如 163 需要使用授权码)RECIPIENT:接收告警的邮箱地址
-
阈值调整:脚本开头的阈值参数可以根据实际需求调整:
- CPU、内存、硬盘使用率阈值(默认 80%)
- IO await 阈值(默认 50)
- 网络流量阈值(默认 10MB/s)
- 检查间隔(默认 60 秒)
-
安装依赖:确保系统安装了必要工具:
sudo apt-get install sendmail bc sysstat # Debian/Ubuntu sudo yum install sendmail bc sysstat # CentOS/RHEL -
运行方式:
# 赋予执行权限 chmod +x system_monitor.sh # 仅执行一次监控 ./system_monitor.sh -o # 以默认间隔(60秒)持续监控 ./system_monitor.sh # 自定义监控间隔(如30秒) ./system_monitor.sh -i 30 -
后台运行:可以使用 nohup 让脚本在后台持续运行:
nohup ./system_monitor.sh &
该脚本会在系统资源超过设定阈值时发送告警邮件,包含具体的资源使用情况,方便您及时了解系统状态。
705

被折叠的 条评论
为什么被折叠?



