サービス監視スクリプトを作成して cron に登録 〜 CentOS6

スポンサーリンク

特定のサービス(デーモン)を監視して、何らかのトラブルなどでサービスが停止した場合に、停止したサービスを自動的に再起動させるシェルスクリプトを作成します。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

このエントリーは、CentOS 6.4 インストール~設定手順の目次 の一部です。

/usr/local/sbin/check-service.sh にシェルスクリプト作成

以下の内容で、シェルスクリプトを作成します。

パーミッション設定。

cron に登録

以上を作って cron に登録。とりあえず、 httpd, mysqld を監視対象にして、1時間に1回チェックする。httpd は毎時1分に、 mysqld は毎時2分にチェックする cron です。

必要に応じて監視対象にするサービスを追加します。監視対象にするサービスは、常に起動しておくべきサービスで、基本的に停止させたらまずいものが対象となります。

【追記 2016/07/07】
joubさんに、シェルスクリプト修正のご報告コメントを頂きました。ありがとうございました。記事内のシェルスクリプトが上手く動かず修正が必要な場合は、ご参考お願いいたします。
【追記ここまで】

スポンサーリンク
サーバ構築研究会の CentOS 本は、昔からお世話になっています。Linux の教科書は Linux の基本を学ぶのにおすすめです。
 
スポンサーリンク
  • 6件のコメント
  • joub

    apacheがたまに異常停止するようになったのでとても助かりました
    ありがとうございました

    ただ バージョン等が違うからか こちら(CentOS6.3)ではうまくいかなかったです

    apache起動時
    # /etc/init.d/httpd status
    httpd (pid 3460) is running…

    apacheが不具合で異常停止した時
    # /etc/init.d/httpd status
    httpd dead but pid file exists

    で 両方とも「pid」が含まれているため 異常停止しても検知されませんでした

    スクリプトの
    if ! $script status | grep -q “pid”


    if ! $script status | grep -q “(pid”

    に変えて 現在運用させていただいています
    以上 ご報告まで

    • taka

      joub さん、こんにちは!
      お役に立てれたら嬉しく思います。
      あとスクリプト修正のご報告もありがとうございます!

  • yoshiaki

    こんにちは。ここのサイトが見つかり、私も助かります。

    $script status | grep -q “pid”
    ここのところですが、
    pgrep $1
    コマンドも使えるかと思います。

    pgrepはご存知の通り、プロセス名からプロセスID一覧を取得するもので、
    マルチプロセスのapacheなどにも使えるかもしれません。

    どちらか一方しか使えないという考えではなく、違うアプローチの方法もあるということで、いかがでしょうか。

    それでは。

    • taka

      yoshiaki さん、こんばんは!コメントありがとうございます。
      おっしゃる通り pgrep を使うスクリプトでも良いと思います。
      というか、そっちのほうがすっきり書けそうですね。

  • joub

    何度もすいません
    僕の場合 apache異常停止時に 以下リンク先のようなの現象が結構発生
    することがわかりました

    http://qiita.com/xxthermidorxx/items/ffe8d5d1479aaf5afeaa

    ってなわけで いまはスクリプトをこのように変更して運営しています
    参考に今一度ご報告申し上げます

    if [ $1 = ‘help’ ] || [ $1 = ‘usage’ ] || [ $1 = ‘man’ ]
    then
    echo “usage:# check-service.sh service”
    else
    service=$1
    script=”/etc/init.d/$service”

    if ! $script status | grep -q “(pid”
    then
    $script stop > /dev/null 2>&1
    if sudo lsof -i | grep -q “$service”
    then
    killall $service
    fi
    $script start
    echo “$service is restarted.”
    else
    echo “$service already runs.”
    fi
    fi

    現在 たまにhttpdが異常停止しますが cronで復帰できてます

    • taka

      joub さん、こんばんは。
      再び詳細なスクリプトをありがとうございます。

Leave Your Message!