이 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

이 서버에서 경고가 수신되었지만 345MB만 사용 중임을 알 수 있습니다.

답변1

3가지 문제:

  1. 두 번 전화하고 있습니다 free. 한 번은트리거링보고서를 보내기 위한 경고입니다. 그 사이에 숫자가 바뀌었을 겁니다. 출력을 변수에 저장하고 동일한 데이터를 두 번 검색합니다.

  2. "사용된" 메모리~해야 한다총 메모리 양에 접근하고 "free"는 항상 0에 접근해야 합니다. 당신이 가지고 있다면미사용즉, 할당되지는 않았지만 최소한 캐시 역할을 해야 하는 리소스를 낭비했다는 의미입니다.

    memused현재 두 번째 열과 세 번째 열을 비교하는 행( $3/$2)을 변경하여 첫 번째 열과 마지막 열을 비교하는 것이 좋습니다 .

  3. 메시지 전달 방법의 형식이 손실된 것 같습니다. 전달 방법(slack.sh)을 확인하여 입력을 고정폭으로 렌더링하거나 탭 및 공백을 적절한 공백으로 바꾸는 것이 좋습니다.

    테이블은 다음과 같아야 합니다.

    사용된 무료 공유됨 버프/캐시 사용 가능
    기억: 2048년 345 1580 27 122 1674년
    교환: 2048년 0 2048년

    그만큼다섯숫자는 "총" 메모리로 시작합니다.마지막숫자는 당신이 관심을 가져야 할 것입니다.

관련 정보