web-dev-qa-db-ja.com

サーバーがダウンまたはオフラインになったことを検出するBashスクリプト

背景:サーバーがダウンしたときにアラートを受け取る必要があります。サーバーがダウンしていると、Sysloadコレクターがアラートを送信できなくなる可能性があります。サーバーがダウンしたときにアラートを受け取るために、それを検出する外部ソース(サーバー)があります。

質問:サーバーがダウンしたりオフラインになったりしたことを検出してアラートメッセージ(電子メール+ SMS)を送信する方法(bashスクリプトが望ましい)はありますか?

18

チェックスクリプトを実行する別のサーバーがある場合は、次のような簡単なPingテストを実行して、サーバーが稼働しているかどうかを確認します。

#!/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で、phonenumber@ txt.att.net、それはあなたの携帯電話にメールを送信します。

ここにSMSゲートウェイへの電子メールのリストがあります:

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

サーバーが公的にアクセス可能なWebサーバーである場合、Webサイトを監視してダウンした場合に警告する無料のサービスがいくつかあります。Webで無料のWebサイトの監視を検索してくださいいくつかを見つける。

24
Johnny

Pingはオプションですが、多くの場合、実際のサーバーがダウンしている間、マシンはping応答を送信できます。エンドツーエンドのテストを行うことをお勧めします。以下の例では、ウェブサーバーからページがリクエストされます。

Webサーバーの場合、次のようになります。

#!/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スクリプトをテストすると、サーバーのさまざまな側面をテストすることもできます。これにより、マシンの予防的な監視を開始できます(サーバーがクラッシュする前に問題を確認してください)。

メールサーバーのチェックと同様ですが、Webページを要求する代わりに、メールサーバーを介して電子メールを送信し、それをメールボックスで受信するかどうかを確認するだけです。

9
jippie

これが私が同じ問題をどのように解決したかです

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

Nagios を使用することを強くお勧めします。これは、必要なサービスを監視および警告するためのインフラストラクチャです(多くのプラグインが利用可能で、独自のプラグインを作成できます)。もちろん、サーバーの可用性を確認するために単純なpingを実行できますが、他の人が指摘しているように、代わりにサービスの可用性(Web、電子メールなど)を確認することをお勧めします(これはnagiosが簡単に実行できます)。

1
emerino