LCX8  

编写一个shell脚本,
功能:磁盘空间检查与预警‌,监控磁盘使用率,超过阈值自动触发邮件报警和钉钉机器人报警

!/bin/bash

配置区

THRESHOLD=${1:-85} # 默认阈值85%,可通过参数1自定义
CHECK_PARTITIONS="/ /data" # 指定检测分区,空值检测所有分区
LOG_FILE="/var/log/disk_monitor.log" # 日志文件路径
MAX_LOG_SIZE=1048576 # 日志最大1MB

邮件报警配置(需要提前配置mailutils或ssmtp)

MAIL_ENABLE=true # 启用邮件通知
ADMIN_EMAIL="admin@example.com"

钉钉机器人配置

DINGTALK_ENABLE=true
DINGTALK_WEBHOOK=""
DINGTALK_SECRET=""

日志记录函数

log() {
local log_msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1"

控制台输出

echo -e "$log_msg"

文件记录(自动轮转)

if [ -f "$LOG_FILE" ] && [ $(wc -c < "$LOG_FILE") -ge $MAX_LOG_SIZE ]; then
mv "$LOG_FILE" "${LOG_FILE}.1"
fi
echo "$log_msg" >> "$LOG_FILE"
}

邮件通知函数

send_mail() {
{
echo "Subject: Disk Alert on $(hostname)"
echo "To: $ADMIN_EMAIL"
echo ""
echo "$1"
} | sendmail -t
}

钉钉机器人通知(需要JSON处理工具jq)

send_dingtalk() {
local timestamp=$(date +%s%3N)
local sign=$(echo -ne "$timestamp\n$DINGTALK_SECRET" | openssl dgst -sha256 -binary | base64)
local msg='{
"msgtype": "text",
"text": {
"content": "'"$1"'"
}
}'

curl -s "$DINGTALK_WEBHOOK"
-H "Content-Type: application/json"
-d "$msg"
--write-out "HTTP状态码:%{http_code}\n" >> $LOG_FILE
}

主检测逻辑

check_disks() {
local df_output

获取磁盘信息

if [ -z "$CHECK_PARTITIONS" ]; then
df_output=$(df -h --output=target,pcent | grep -v 'Mounted')
else
df_output=$(df -h --output=target,pcent $CHECK_PARTITIONS | grep -v 'Mounted')
fi

遍历检测

echo "$df_output" | while read -r target pcent; do
local usage=${pcent%%%}

if [ $usage -ge $THRESHOLD ]; then
local alert_msg=" 磁盘告警:分区 $target 使用率 ${usage}% (阈值 ${THRESHOLD}%)"

log "$alert_msg"

触发邮件通知

if $MAIL_ENABLE; then
send_mail "$alert_msg" && log "邮件已发送至 $ADMIN_EMAIL"
fi

触发钉钉通知

if $DINGTALK_ENABLE && [ -n "$DINGTALK_WEBHOOK" ]; then
send_dingtalk "$alert_msg" && log "钉钉通知已发送"
fi
fi
done
}

脚本入口

main() {
log "==== 磁盘检测开始 "
check_disks
log "
检测完成 ====\n"
}

执行主函数

main

posted on 2025-04-08 14:49  樱桃是蓝色的  阅读(142)  评论(0)    收藏  举报