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


17

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

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

回答:


24

checkスクリプトを実行する別のサーバーがある場合、次のようなものは、サーバーが稼働しているかどうかを確認するための簡単な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では、電話番号 @ txt.att.netにメールを送信すると、そのメールが電話に送信されます。

SMSゲートウェイへの電子メールのリストは次のとおりです。

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

サーバーが一般にアクセス可能なウェブサーバーである場合、ウェブサイトを監視し、ダウンしている場合に警告する無料のサービスがあります。ウェブを検索して無料のウェブサイト監視を検索します。


SMSアラートメッセージについて詳しく説明できますか?
メリーランドマババー・ラーマン

4
サーバーにpingを送信する代わりに、サーバーの実行に関心があることをテストする必要があります。たとえば、メールサーバーの場合は、メールを正常に送受信することがより重要です。
ジム・パリ

質問では、サーバーで実行されているサービスを指定していないため、サーバーのアップ/ダウンの検出を求められたため、回答ではアプリケーションの検出を避けました。検出される可能性のある数百の一般的なサービスと、無制限の数のカスタムアプリケーションがあります。彼はサービスを監視しているローカルサービスモニター(sysload)を持っているようです。
ジョニー

Pingはほとんど役に立たない。サーバーがダウンしていますが、3パケットのうち3パケットが返され、最終的な戻り値は0になります。ローカルマシンが「Destination host unreachable」パケットを返しています。
AlastairG

@AlastairG-これは質問として尋ねた方が良いでしょう、コメントに答えるのに十分な余地がありません。しかし、最初にサイトを検索して、誰かが同様の質問をしたかどうかを確認してください。そこで答えが見つかるかもしれません。
ジョニー

9

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

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ドキュメントに変更し、de phpスクリプトでデータベース接続、ファイルシステムなどのテストを行う場合、サーバーのより多くの側面をテストすることさえできます。そうすれば、マシンの予防的な監視を開始できます(サーバーがクラッシュする前に問題を確認してください)。

メールサーバーのチェックと同様ですが、Webページをリクエストする代わりに、メールサーバーを介してメールを送信し、メールボックスで受信するかどうかを確認します。


あなたの受信トレイに転送ルートの電子メールを得た場合、あなたが(それはあなたに標準出力を送信するため)のcrontabにこのスクリプトを実行する場合は、sendmailに持っていけない
pscheit

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)ローカルマシンでこれを呼び出している場合、Apacheが死んだことを教えてくれると思いますが、この方法はしません。(2)ローカルマシンでこれを使用し、ネットワークがダウンしている、またはこのボックスとエッジサーバーなどの間に何かがある場合、メールを受信できず、問題があることもわかりません。あなたが別のマシン上でこれを使用する場合に指定しない限り、それが停止する挽くでしょうifyouがmulitpleホストを見ていたので、(3)は、あなたのカールのコマンドは、タイムアウトするまでに時間がかかります...
マイク・Q

1

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


それはクールな製品です、セキュリティの懸念について疑問に思う
マイクQ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.