精胜 發表於 2025-4-8 14:49:00

常用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" ] &amp;&amp; [ $(wc -c &lt; "$LOG_FILE") -ge $MAX_LOG_SIZE ]; then
    mv "$LOG_FILE" "${LOG_FILE}.1"
fi
echo "$log_msg" &gt;&gt; "$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" &gt;&gt; $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" &amp;&amp; log "邮件已发送至 $ADMIN_EMAIL"
      fi
      
      # 触发钉钉通知
      if $DINGTALK_ENABLE &amp;&amp; [ -n "$DINGTALK_WEBHOOK" ]; then
            send_dingtalk "$alert_msg" &amp;&amp; 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]
查看完整版本: 常用Shell脚本编写——系统监控类‌