- 更新日: 2016年7月7日
- CentOS & Linux
サービス監視スクリプトを作成して cron に登録 〜 CentOS6
スポンサーリンク
特定のサービス(デーモン)を監視して、何らかのトラブルなどでサービスが停止した場合に、停止したサービスを自動的に再起動させるシェルスクリプトを作成します。
【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
スポンサーリンク
このエントリーは、CentOS 6.4 インストール~設定手順の目次 の一部です。
/usr/local/sbin/check-service.sh にシェルスクリプト作成
以下の内容で、シェルスクリプトを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# vi /usr/local/sbin/check-service.sh #!/bin/bash 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 $script start echo "$service is restarted." else echo "$service already runs." fi fi |
パーミッション設定。
1 2 3 |
# chmod 700 /usr/local/sbin/check-service.sh |
cron に登録
以上を作って cron に登録。とりあえず、 httpd, mysqld を監視対象にして、1時間に1回チェックする。httpd は毎時1分に、 mysqld は毎時2分にチェックする cron です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# vi /etc/crontab # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 1 * * * * root /usr/local/sbin/check-service.sh httpd 2 * * * * root /usr/local/sbin/check-service.sh mysqld |
必要に応じて監視対象にするサービスを追加します。監視対象にするサービスは、常に起動しておくべきサービスで、基本的に停止させたらまずいものが対象となります。
【追記 2016/07/07】
joubさんに、シェルスクリプト修正のご報告コメントを頂きました。ありがとうございました。記事内のシェルスクリプトが上手く動かず修正が必要な場合は、ご参考お願いいたします。
【追記ここまで】
スポンサーリンク
サーバ構築研究会の CentOS 本は、昔からお世話になっています。Linux の教科書は Linux の基本を学ぶのにおすすめです。
<< 前の記事 : IPv6を無効化 〜 CentOS6
- CentOS & Linux の関連記事
- Job for nginx.service failedのNginxエラー
- upstream sent too big header while reading response header from upstream(Nginx/Rails)
- Can’t get information about user clamav(clamdエラー)
- STDERR: Exception in thread “main” java.lang.InternalErrorエラー
- Linuxサーバー容量を確認するコマンドdf,duをマスターする!
- rmでファイル削除後にdf -hで容量が減らない時の対処(Linux)
- Apacheをローカルネットワークのみに公開にする
- logwatchからのメールが来ないと思ったら…
- Linuxサーバの負荷や使用率を調査するコマンドと手順
- Bashの脆弱性もう一件CVE-2014-7169に対するパッチ適用
- 初回公開日: 2013年6月30日
- 6件のコメント
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”
に変えて 現在運用させていただいています
以上 ご報告まで
joub さん、こんにちは!
お役に立てれたら嬉しく思います。
あとスクリプト修正のご報告もありがとうございます!
こんにちは。ここのサイトが見つかり、私も助かります。
$script status | grep -q “pid”
ここのところですが、
pgrep $1
コマンドも使えるかと思います。
pgrepはご存知の通り、プロセス名からプロセスID一覧を取得するもので、
マルチプロセスのapacheなどにも使えるかもしれません。
どちらか一方しか使えないという考えではなく、違うアプローチの方法もあるということで、いかがでしょうか。
それでは。
yoshiaki さん、こんばんは!コメントありがとうございます。
おっしゃる通り pgrep を使うスクリプトでも良いと思います。
というか、そっちのほうがすっきり書けそうですね。
何度もすいません
僕の場合 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で復帰できてます
joub さん、こんばんは。
再び詳細なスクリプトをありがとうございます。