Webサーバーの挙動を定期的に(例えば1分毎)チェックして、もしWebサーバーへのhttpアクセスが3回続けて出来ない場合にはApacheが落ちていると判断し、Apacheを再起動、そしてその旨をメールで通知するシェルスクリプト(bash)はどう書けばいいでしょうか。


Cronで動作させたいと思っていますので、チェックのインターバルについてはCron設定に依存するものとします。

LinuxのVPSを利用しています。

回答の条件
  • 1人5回まで
  • 登録:2007/03/21 22:14:56
  • 終了:2007/03/28 22:15:03

回答(1件)

id:arcana No.1

arcana回答回数120ベストアンサー獲得回数102007/03/23 23:49:27

ポイント60pt

結論から言うと bash のみでは実装できません。

http 通信は一方通行ではなく、何度かのやり取りの後にコンテンツデータを返すので、

少なくともインタラクティブ的な動作が必要となってきます。

実現するとしたら Expect でシェルを書くか、

Perl の LWP モジュール辺りを利用するか、などになると思います。


Webサーバ監視スクリプト - CGIとWEBアプリケーションの開発・販売「ウェブウェア・オルグ」

こちらはご参考までに。


nmap が監視元サーバに入っている場合、それを利用して bash で作成することは可能かもしれません。

※直接 Port の開閉を確認する仕様になりますので、

 コンテンツが正常に提供出来ている保証にはなりませんが。

  • id:kurukuru-neko

    何かアクセス用のページを作成して
    そのURL・CGIをwget等でアクセスする。

    # 一時ファイル名
    TMPF=/tmp/tmpwget.$$.tmp

    # エラーのカウントファイル
    ERRCNT=/tmp/tmperrcnt.txt

    # タイムアウト30秒
    wget -T 30 -q -O - "http://127.0.0.1/xxxxx" >$TMPF
    RC=$?
    if [ $RC -eq 0 ] ; then
    # xxx.datと正常時のok.datを比較
    cmp -s $TMPF ok.dat
    RC=$?
    fi
    rm -f $TMPF

    # CGI等が呼び出しにより実行されて
    # 特定のファイルの更新、アクセス
    # される事を確認する。
    #
    if [ $RC -eq 0 ] ; then
    # CGI呼び出しで参照更新されるファイル
    TESTF=/var/apache2/xxx.log
    # 更新が1分以内に場合のチエックわれたか?
    CHK=`find $TESTF -mmin 1 -type f -print0`
    if [ "$TESTF" != "$CHK" ] ; then
    # 更新なし
    RC=1
    fi

    # 参照が1分以内に行われたかチエックする?
    CHK=`find $TESTF -amin 1 -type f -print0`
    if [ "$TESTF" != "$CHK" ] ; then
    # アクセスなし
    RC=1
    fi
    fi

    #
    # ERRORのカウント
    #
    if [ $RC -eq 0 ] ; then
    # エラークリア
    echo 0 >$ERRCNT
    else
    # ERROR
    if [ -f $ERRCNT ]; then
    CNT=`cat $ERRCNT`
    else
    echo 0 >$ERRCNT
    CNT=0
    fi

    let CNT=CNT+1
    echo $CNT >$ERRCNT

    # エラーが3回目の場合
    if [ $CNT -eq 3 ] ; then
    # メールする処理
    fi

    fi
    exit


  • id:harrypotter
    ありがとうございます!
    試させていただきます。

    ポイント等差し上げたいので、適当で結構ですので回答欄にも入れていただけると助かります。
    宜しくお願いいたします。
  • id:harrypotter
    上記を参考にさせていただいて、以下のようなスクリプトにしました。
    ------------
    #!/bin/sh

    ## エラーのカウントファイル
    ERRCNT=./tmperrcnt.txt

    ## リブート記録
    REBOOT=./rebootlog.txt

    ## 時刻
    TIME=`date`

    /usr/bin/wget -T 30 -q -O - "http://www.hogehogeho.com/webcheck.txt"
    RC=$?

    if [ $RC -ne 0 ] ; then

    if [ -f $ERRCNT ]; then
    CNT=`cat $ERRCNT`
    else
    echo 0 >$ERRCNT
    CNT=0
    fi

    let CNT=CNT+1
    echo $CNT >$ERRCNT

    if [ $CNT -ge 3 ] ; then

    cat <<END | /usr/sbin/sendmail -t
    Return-Path: <xxxx@hogehogeho.com>
    From: CRON <xxxx@hogehogeho.com>
    To: YOU <you@hogehogeho.com>
    Subject: Webserver Reboot
    X-Mailer: Webserver Reboot

    リブートしました。
    END

    echo $TIME >> $REBOOT

    echo 0 >$ERRCNT
    CNT=0

    /usr/sbin/apachectl restart

    fi

    fi

    exit

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません