常用Shell脚本编写——系统监控类
<p>编写一个shell脚本,<br>功能:磁盘空间检查与预警,监控磁盘使用率,超过阈值自动触发邮件报警和钉钉机器人报警</p>
<h1 id="binbash">!/bin/bash</h1>
<h1 id="配置区">配置区</h1>
<p>THRESHOLD=${1:-85} # 默认阈值85%,可通过参数1自定义<br>
CHECK_PARTITIONS="/ /data"# 指定检测分区,空值检测所有分区<br>
LOG_FILE="/var/log/disk_monitor.log"# 日志文件路径<br>
MAX_LOG_SIZE=1048576 # 日志最大1MB</p>
<h1 id="邮件报警配置需要提前配置mailutils或ssmtp">邮件报警配置(需要提前配置mailutils或ssmtp)</h1>
<p>MAIL_ENABLE=true # 启用邮件通知<br>
ADMIN_EMAIL="admin@example.com"</p>
<h1 id="钉钉机器人配置">钉钉机器人配置</h1>
<p>DINGTALK_ENABLE=true<br>
DINGTALK_WEBHOOK=""<br>
DINGTALK_SECRET=""</p>
<h1 id="日志记录函数">日志记录函数</h1>
<p>log() {<br>
local log_msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1"</p>
<pre><code># 控制台输出
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"
</code></pre>
<p>}</p>
<h1 id="邮件通知函数">邮件通知函数</h1>
<p>send_mail() {<br>
{<br>
echo "Subject: Disk Alert on $(hostname)"<br>
echo "To: $ADMIN_EMAIL"<br>
echo ""<br>
echo "$1"<br>
} | sendmail -t<br>
}</p>
<h1 id="钉钉机器人通知需要json处理工具jq">钉钉机器人通知(需要JSON处理工具jq)</h1>
<p>send_dingtalk() {<br>
local timestamp=$(date +%s%3N)<br>
local sign=$(echo -ne "$timestamp\n$DINGTALK_SECRET" | openssl dgst -sha256 -binary | base64)<br>
local msg='{<br>
"msgtype": "text",<br>
"text": {<br>
"content": "'"$1"'"<br>
}<br>
}'</p>
<pre><code>curl -s "$DINGTALK_WEBHOOK" \
-H "Content-Type: application/json" \
-d "$msg" \
--write-out "HTTP状态码:%{http_code}\n" >> $LOG_FILE
</code></pre>
<p>}</p>
<h1 id="主检测逻辑">主检测逻辑</h1>
<p>check_disks() {<br>
local df_output</p>
<pre><code># 获取磁盘信息
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
</code></pre>
<p>}</p>
<h1 id="脚本入口">脚本入口</h1>
<p>main() {<br>
log "==== 磁盘检测开始 <mark><mark>"<br>
check_disks<br>
log "</mark></mark> 检测完成 ====\n"<br>
}</p>
<h1 id="执行主函数">执行主函数</h1>
<p>main</p><br><br>
来源:https://www.cnblogs.com/LCX8/p/18804877
頁:
[1]