내 서버가 다운되거나 오프라인일 때를 감지하는 Bash 스크립트

내 서버가 다운되거나 오프라인일 때를 감지하는 Bash 스크립트

배경: 서버가 다운되면 알림을 받아야 합니다. 서버가 다운되면 Sysload 수집기가 경고를 보내지 못할 수도 있습니다. 서버가 다운되었을 때 경고를 받기 위해 이를 감지할 외부 소스(서버)가 있습니다.

질문: 서버가 다운되거나 오프라인일 때를 감지하고 경고 메시지(이메일 + SMS)를 보낼 수 있는 방법이 있습니까(저는 bash 스크립트를 선호합니다)?

답변1

검사 스크립트를 실행할 별도의 서버가 있는 경우 다음과 같이 간단한 핑 테스트를 수행하여 서버가 살아 있는지 확인합니다.

#!/bin/bash
SERVERIP=192.168.2.3
[email protected]

ping -c 3 $SERVERIP > /dev/null 2>&1
if [ $? -ne 0 ]
then
   # Use your favorite mailer here:
   mailx -s "Server $SERVERIP is down" -t "$NOTIFYEMAIL" < /dev/null 
fi

주기적으로 cron 스크립트를 실행할 수 있습니다.

mailx가 없으면 해당 줄을 사용 중인 명령줄 전자 메일 프로그램으로 바꾸고 옵션을 변경해야 합니다. 이동통신사가 SMS 이메일 주소를 제공하는 경우 해당 주소로 이메일을 보낼 수 있습니다. 예를 들어 AT&T의 경우 다음 주소로 이메일을 보내면전화 번호@txt.att.net 귀하의 휴대폰으로 이메일을 보내드립니다.

다음은 SMS 게이트웨이로 전송된 이메일 목록입니다.

http://en.wikipedia.org/wiki/List_of_SMS_gateways

귀하의 서버가 공개적으로 액세스 가능한 웹 서버인 경우 귀하의 웹사이트를 모니터링하고 웹사이트가 다운되면 알림을 보낼 수 있는 무료 서비스가 있습니다.무료 웹사이트 모니터링좀 찾아보세요.

답변2

Ping은 옵션이지만, 많은 경우 머신이 참조하는 실제 서버가 다운된 동안에도 머신은 ping 응답을 보낼 수 있습니다. 끝까지 테스트하는 것이 가장 좋습니다. 다음 예에서는 웹 서버에서 페이지를 요청합니다.

웹 서버라면 다음과 같을 것입니다.

#!/bin/bash
wget -qO /dev/null 'http://webserver/some_existing_short_document.html' || {
    echo "Webserver down"
    # another mailer example
    sendemail -s mailserverip -f 'from@localhost' -t 'user@localhost' -u 'Webserver down' -m 'The webserver is down'
}

HTML 문서를 PHP 문서로 변경하고 PHP 스크립트를 사용하여 데이터베이스 연결, 파일 시스템 등과 같은 항목을 테스트하면 서버의 더 많은 측면을 테스트할 수도 있습니다. 이렇게 하면 컴퓨터를 사전에 모니터링할 수 있습니다(서버가 충돌하기 전에 문제를 찾아냄).

메일 서버를 확인하는 것과 비슷하지만 웹페이지를 요청하는 대신 메일 서버를 통해 이메일을 보내고 메일함에 수신되는지 확인하면 됩니다.

답변3

이것이 동일한 문제를 해결한 방법입니다.

#!/bin/bash
NOTIFYEMAIL=<your email>
SMSEMAIL=<cell phone number @ sms-gateway>
SENDEREMAIL=alert@localhost
SERVER=http://127.0.0.1/
PAUSE=60
FAILED=0
DEBUG=0

while true 
do
/usr/bin/curl -sSf $SERVER > /dev/null 2>&1
CS=$?
# For debugging purposes
if [ $DEBUG -eq 1 ]
then
    echo "STATUS = $CS"
    echo "FAILED = $FAILED"
    if [ $CS -ne 0 ]
    then
        echo "$SERVER is down"

    elif [ $CS -eq 0 ]
    then
        echo "$SERVER is up"
    fi
fi

# If the server is down and no alert is sent - alert
if [ $CS -ne 0 ] && [ $FAILED -eq 0 ]
then
    FAILED=1
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER failed"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$SMSEMAIL" 
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$NOTIFYEMAIL" 
    fi

# If the server is back up and no alert is sent - alert
elif [ $CS -eq 0 ] && [ $FAILED -eq 1 ]
then
    FAILED=0
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER is back up"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$SMSEMAIL"
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$NOTIFYEMAIL"
    fi
fi
sleep $PAUSE
done

답변4

나는 사용하는 것이 좋습니다나기오스, 원하는 서비스를 모니터링하고 경고하기 위한 인프라입니다(사용 가능한 플러그인이 많으며 직접 작성할 수도 있습니다). 서버 가용성을 확인하기 위해 간단한 ping을 수행하는 것은 확실히 가능하지만 다른 사람들이 지적했듯이 서비스 가용성(예: 네트워크, 이메일 등)을 확인하는 것이 더 좋습니다(nagios는 이를 쉽게 수행할 수 있습니다).

관련 정보