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


17

배경 : 서버가 다운되면 경고를 받아야합니다. 서버가 다운되면 Sysload 콜렉터가 경보를 보낼 수 없습니다. 서버가 다운되었을 때 경고를 수신하기 위해 서버를 감지 할 외부 소스 (서버)가 있습니다.

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

답변:


24

확인 스크립트를 실행할 별도의 서버가있는 경우 다음과 같이 간단한 Ping 테스트를 수행하여 서버가 활성 상태인지 확인하십시오.

#!/bin/bash
SERVERIP=192.168.2.3
NOTIFYEMAIL=test@example.com

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를 사용하면 phonenumber @ txt.att.net으로 전자 메일을 보내면 전자 메일을 전화기로 보냅니다.

다음은 SMS 게이트웨이에 대한 전자 메일 목록입니다.

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

서버가 공개적으로 액세스 가능한 웹 서버 인 경우 웹 사이트를 모니터링하고 다운 된 경우 경고하는 무료 서비스가 있습니다. 웹 사이트에서 무료 웹 사이트 모니터링 을 검색하여 일부를 찾으십시오.


SMS 알림 메시지에 대해 자세히 설명 할 수 있습니까?
Md Mahbubur Rahman

4
서버를 핑 (ping)하는 대신 서버가 수행하는 작업에 관심이있는 모든 것을 테스트해야합니다. 예를 들어 메일 서버 인 경우 메일을 성공적으로 보내고받는 것이 훨씬 중요합니다.
Jim Paris

질문에 서버에서 실행중인 서비스를 지정하지 않았기 때문에 응용 프로그램 감지를 멀리했습니다. 그는 서버 업 / 다운 감지를 요청했습니다. 감지 할 수있는 수백 개의 공통 서비스와 무제한 사용자 정의 응용 프로그램이 있습니다. 서비스를 모니터링하는 로컬 서비스 모니터 (sysload)가있는 것 같습니다.
Johnny

핑은 나에게 쓸모가 없다. 서버가 다운되었지만 3 개의 패킷 중 3 개가 반환되고 최종 반환 값이 0이됩니다. 어떻게됩니까? 로컬 컴퓨터가 "대상 호스트에 연결할 수 없음"패킷을 반환합니다.
AlastairG

@AlastairG-이것은 질문으로 더 잘 대답 할 것입니다. 댓글에 대답 할 충분한 공간이 없습니다. 그러나 누군가가 비슷한 질문을했는지 확인하기 위해 먼저 사이트를 검색하면 거기서 답변을 찾을 수 있습니다.
Johnny

9

핑 (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 스크립트 테스트를 수행하면 서버의 더 많은 측면을 테스트 할 수도 있습니다. 이렇게하면 시스템의 사전 모니터링을 시작할 수 있습니다 (서버가 충돌하기 전에 문제 참조).

메일 서버를 확인하는 것과 유사하지만 웹 페이지를 요청하는 대신 메일 서버를 통해 전자 메일을 보내면 사서함에서 메일을 받는지 확인할 수 있습니다.


루트 이메일을받은 편지함에 전달한 경우 crontab에서이 스크립트를 실행하면 stdout을 보내므로 메일을 보내지
않아도됩니다.

5

동일한 문제를 해결하는 방법은 다음과 같습니다.

#!/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

내 Mac에서 실행되도록 적응해야했습니다 /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL

이 솔루션은 반드시 작동하지만 확실합니다. (1) 로컬 컴퓨터에서 이것을 호출하면 아파치가 죽었다고 말할 것입니다.하지만이 방법으로는하지 않습니다. (2) 로컬 컴퓨터에서 이것을 사용하고 네트워크가 다운 되거나이 상자와 에지 서버 또는 다른 서버 사이에있는 경우 전자 메일을받지 못하거나 문제가 있음을 알 수 없습니다. (3) 다른 머신에서 이것을 사용하는 경우 curl 명령은 지정되지 않는 한 시간이 오래 걸리므로 여러 호스트를보고 있으면 중단 될 수 있습니다.
Mike Q

1

Nagios를 사용하는 것이 좋습니다. 원하는 모든 서비스 (많은 플러그인을 사용할 수 있으며 직접 작성할 수 있음)에 대한 모니터링 및 경고 인프라입니다. 물론 서버 가용성을 확인하기 위해 간단한 핑 (ping)을 수행 할 수 있지만, 다른 사람들이 지적했듯이 대신 서비스 가용성 (예 : 웹, 전자 메일 등)을 대신 확인하는 것이 좋습니다 (nagios가 쉽게 수행 할 수 있음).


멋진 제품입니다. 보안 문제가 궁금합니다.
Mike Q
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.