為什麼這個 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 27 122 第1674章
    交換: 2048 0 2048

    數字以“總”內存開頭,如果有的話,最後的number 是您應該關心的號碼。

相關內容