为什么这个 bash 脚本在监控内存使用情况时会触发如此多的误报?

为什么这个 bash 脚本在监控内存使用情况时会触发如此多的误报?

我正在使用以下脚本监控数百台专用和虚拟服务器:

#!/bin/bash

PATH=/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

threshold=90

serverip=$($(which ifconfig) | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -1)
memused=$(free | awk '/Mem/{printf("RAM Usage: %.2f%\n"), $3/$2*100}' |  awk '{print $3}' | cut -d"." -f1)

if [ "$memused" -gt "$threshold" ]
then
    CTIME=$(date +%Y-%m-%d-%H%M%S)
    ps aux > /root/.example/logs/lowmem-"${CTIME}"-ps.log
    top -n 1 -o %MEM -c > /root/.example/logs/lowmem-"${CTIME}"-top.log
    free -m > /root/.example/logs/lowmem-"${CTIME}"-free.log
    mysqladmin proc -v status > /root/.example/logs/lowmem-"${CTIME}"-mysqlproc.log
    bash /example/general/slack.sh "#server-alerts" ":warning: $(hostname) -  ${serverip} - Memory Usage has reached 90% - Check logs /root/.example/logs/lowmem-${CTIME} \n \`\`\`$(head -1 /root/.example/logs/lowmem-"${CTIME}"-free.log) \n $(head -2 /root/.example/logs/lowmem-"${CTIME}"-free.log | tail -1) \n $(tail -1 /root/.example/logs/lowmem-"${CTIME}"-free.log)\`\`\`"
    crontab -l | grep -v '/example/mon_mem.sh' | crontab -
    sleep 900
    crontab -l | { cat; echo "* * * * * bash /example/mon_mem.sh"; } | crontab -
fi

虽然它在大多数情况下都有效,但我们会随机得到误报,它是完全随机的服务器,并且与每个服务器不一致,因此一个服务器可能会触发,但随后不会再触发(错误)

误报示例:

total used free shared buff/cache available 
Mem: 2048 345 1580 27 122 1674 
Swap: 2048 0 2048

该服务器发出了警报,但您可以看到仅使用了 345 MB。

答案1

3个问题:

  1. 您正在拨打free两次电话:一次是触发警告,一次发送报告。数字在这期间会发生变化。存储输出(在变量中),并检索相同的数据两次。

  2. “已使用”内存应该接近内存总量,而“空闲”应该始终接近零。如果你有没用过内存,这意味着你浪费了虽然没有分配但至少应该用作缓存的资源。

    我建议您将memused当前比较第二列与第三列($3/$2)的行更改为比较第一列与最后一列。

  3. 您的消息传递方法似乎丢失了格式。可能需要检查您的传递方法 (slack.sh),以在等宽字体中呈现您的输入,或用适当的分隔符替换制表符和空格。

    该表看起来应该是这样的:

    全部的 用过的 自由的 共享 缓冲/缓存 可用的
    记忆: 2048 345 1580 二十七 122 1674
    交换: 2048 0 2048

    数字以“总”记忆开始,如果有的话,最后的号码是您应该关心的。

相关内容