FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

bashとcronでプロセス監視

常駐プロセスを監視するバッチを書いてみました。
psを見て指定された文字列が無い場合、エラーメールが届きます。

#!/bin/bash
MAIL=me@example.com
NOCHECK=/tmp/nocheck
if [ -e $NOCHECK ];
then
exit 0
fi

isAlive=`ps -ef | grep $1 | grep -v grep | grep -v process_watch.sh | wc -l`
if [ $isAlive -eq 0 ]; then
echo stop_process $1 | mail -s stop_process $MAIL
exit 1
fi

process_watch.sh
というファイル名にしています。もしファイル名を変えるなら
grep -v process_watch.sh
の部分も修正してください。
また、一時的に監視を止めたい場合、/tmp/nochecというファイルを作成すると
プロセスの状況によらず、このスクリプトは正常終了します。

chmod 755 /opt/process_watch.sh
で実行パーミッションを設定してます。
cronの設定例は以下の通りです。

10 * * * * /opt/process_watch.sh target.rb

これは、毎時10分にtarget.rbがpsに存在しているかチェックしています。

ファイルサーババックアップ for ubuntu

以前書いたファイルサーババックアップをubuntu用に書き換えました。
大きな違いは週次バックアップのスクリプトの中に過去一ヶ月前のものを削除するように修正したことです。

■日次バックアップ(/home/myaccount/bin/backup_daily.sh)

#!/bin/bash
rsync -avz --delete -e ssh myaccount@192.168.0.1:/var/samba /home/myaccount/backup/daily
rsync -avz --delete -e ssh myaccount@192.168.0.1:/var/svn /home/myaccount/backup/daily

■週次バックアップ(/home/myaccount/bin/backup_weekly.sh)

#!/bin/bash
YMD=`date +"%Y%m%d"`
rsync -avz --delete -e ssh myaccount@192.168.0.1:/var/samba /home/myaccount/backup/weekly/$YMD
rsync -avz --delete -e ssh myaccount@192.168.0.1:/var/svn /home/myaccount/backup/weekly/$YMD
BASE=`date -d '1 month ago' +%Y%m%d`
for FILE in `ls /home/myaccount/backup/weekly`
do
if [ "$BASE" \> "$FILE" ];
then rm -rf /home/myaccount/backup/weekly/$FILE
fi
done

■cronの設定

0 1 * * * /home/myaccount/bin/backup_daily.sh
0 2 * * 0 /home/myaccount/bin/backup_weekly.sh

bashでhttpサーバの監視

Apache用にhttpサーバの監視スクリプトを書きました。
まあ、httpサーバならなんでもいいんですけど。
監視したいURLと、そのURLにアクセスした時に返ってくるデータのなかに含まれる文字列をTARGETに指定します。
指定回数失敗すると、スクリプトの最後の命令が実行されます。
メールを送るなり、フェールオーバーするなり、好きなことができます。

スクリプトの肝はcheck_onceのところです。
wgetの-Oオプションにハイフン(-)を渡すと、標準出力に出力されます。
その内容をgrepに渡してtarget文字列を検索します。
grepで検索がマッチすると、行が生成されるのでwcコマンドで行数を数えて1行以上あれば、正常とみなします。


#!/bin/bash

# 監視したいURL
URL='http://example.com/'

# 監視したい文字列
TARGET='alive'

# アクセスタイムアウト
TIMEOUT=10

# 監視回数、この回数回失敗した場合失敗とみなす
REPEAT=3

# 一回失敗した後のスリープ時間
REPEAT_SLEEP=2

# 成功した後のスリープ時間
SUCCESS_SLEEP=5

# 指定したURLから指定した文字列が入っているかチェック
# 引数
# 1. チェックしたいURL
# 2. チェックしたい文字列
# 3. タイムアウト秒
# 返り値
# 含まれている数
function check_once() {
return `wget --timeout $3 -O - $1 2> /dev/null |grep $2|wc -l`;
}

# 指定したURLが生きているかチェック
# 引数
# 1. チェックしたいURL
# 2. チェックしたい文字列
# 3. タイムアウト秒
# 4. チェック回数
# 5. スリープ秒
function check() {
count=1
while [ $count -le $4 ]
do
check_once $1 $2 $3
if [ $? -ne 0 ];
then
return 0
fi
if [ $count -eq $4 ];
then
return 1
fi
sleep $5
count=`expr $count + 1`
done
return 1
}

# 生きている間チェックしつづける
while check $URL $TARGET $TIMEOUT $REPEAT $REPEAT_SLEEP; do
sleep $SUCCESS_SLEEP
done
echo fail!

一行入魂サイトにまとめがあります。

Apacheのログ設定とログ削除

バックアップやログの話などインフラな話題が続きますが、今回はApacheのログです。
Apacheのログローテートはlogrotateとrotatelogの二種類があります。
logrotateはローテートのタイミングでプロセスの再起動が必要になり、rotatelogはログを書く度に余分なプロセスを起動する分、重くなります。
とりあえず、現在はそれほどCPU負荷が高くないので、rotatelogを採用しました。
■http.confの設定

CustomLog "|/opt/httpd/bin/rotatelogs -l /var/log/httpd/access/%Y%m%d.log 86400" common
ErrorLog "|/opt/httpd/bin/rotatelogs -l /var/log/httpd/error/%Y%m%d.log 86400"

86400秒、つまり一日ごとにログローテートしています。-lオプションを付けることで、ローカルタイムで日付が変更されます。 ログの出し方はcommonとconbinedがありまして、conbinedはリファラーとユーザエージェントが追加されます。
■ログの削除スクリプト

#!/bin/bash
LOGDIR=/var/log/httpd/access
FILE_EXT=.log
BASE=$LOGDIR/`date -d '1 month ago' +%Y%m%d`$FILE_EXT
for FILE in `ls $LOGDIR/*$FILE_EXT`
do
if [ "$BASE" \> "$FILE" ];
then rm $FILE
fi
done
LOGDIR=/var/log/httpd/error
FILE_EXT=.log
BASE=$LOGDIR/`date -d '1 month ago' +%Y%m%d`$FILE_EXT
for FILE in `ls $LOGDIR/*$FILE_EXT`
do
if [ "$BASE" \> "$FILE" ];
then rm $FILE
fi
done

いつものように一ヶ月を超えるものは削除しています。
accessログとerrorログを別々に取っているので、それぞれ2回ループを回しています。

一行入魂サイトにまとめがあります。

Tag : Apache

ファイルサーババックアップ

ファイルサーバのバックアップを古いMac miniにとっていましたが、容量が足りなくなってきました。
日次にファイルサーバと同期をとり、週次にフルバックアップをとっているのですが、
週次が溜まりすぎてしまいました。
で、週次バックアップは直近一ヶ月のみ保存するような運用にしました。
一ヶ月過ぎていたら、削除します。
本当は全部bashで書こうと思っていたのですが、古いMacOSX(panther?)だとdateコマンドが過去に戻れないようなので、過去削除はrubyで書きました。

■日次バックアップ

#!/bin/bash
rsync -avz --delete -e ssh user@192.168.0.1:/var/samba /Users/user/Backup/daily
rsync -avz --delete -e ssh user@192.168.0.1:/var/svn /Users/user/Backup/daily

■週次バックアップ

#!/bin/bash
YMD=`date +"%Y%m%d"`
rsync -avz --delete -e ssh user@192.168.0.1:/var/samba /Users/user/Backup/weekly/$YMD
rsync -avz --delete -e ssh user@192.168.0.1:/var/svn /Users/user/Backup/weekly/$YMD
/usr/bin/ruby /Users/aoyagi/Backup/rm.rb

■過去削除スクリプト

#coding:UTF-8
require 'date'

day = Date.today
day = day << 1
target = day.strftime("%Y%m%d")
dir = "/Users/user/Backup/weekly"

Dir.foreach(dir) {|f|
if "." != f && ".." != f && "20000101" <= f && f <= target
system("rm -rf "+dir+"/"+f)
end
}

■cronの設定

0 1 * * * /Users/user/Backup/backup_daily.sh
0 2 * * 0 /Users/user/Backup/backup_weekly.sh
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。