Scrapdiary

DesigningとEngineeringの架け橋

ログローテーションに対応したSwatchの起動スクリプト

「これでOK」かとタカを括っていたSwatchのログローテーション対応。しかしながら、実際はうまくいっていなかった。--restart-timeなどSwatchのオプションから何か解決の糸口はないかとmanを眺めてみると、--pid-fileというオプションで起動させたSwatchのプロセスIDをファイルとして保存しておけるらしい。このプロセスIDを使ってに0時になったら一度killして再度Swatchを起動しなおす方法を探ってみた。
shell scriptのベースに関しては下記のサイトを参考にさせていただいた。

こちらはinet.dに登録する起動スクリプトを想定して書かれているので、再起動させる目的のため簡易的に書き直し*1てみた。

#!/bin/sh

# Export environment variables.【1】 
export PATH=$PATH:$HOME/local/bin
export PERL5LIB=$HOME/local/lib/perl5:$HOME/local/lib/perl5/i686-linux

# Main start.
echo "-------------------------------------------------------------------"

# Stop daemons.【2】
ls ~/.swatch/pid > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "Shutting down swatch"
    pid=~/.swatch/pid
    kill $(cat $pid)
    rm -f $pid
    rm -f ~/.swatch/.swatch_script.*
else
    echo "swatch is not running"
fi

# Check log file.【3】
ls /foo/bar/debug_`date '+%Y%m%d'`.log > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "Making empty log file:" /foo/bar/debug_`date '+%Y%m%d'`.log
    touch /foo/bar/debug_`date '+%Y%m%d'`.log
    chmod 666 /foo/bar/debug_`date '+%Y%m%d'`.log
else
    echo "Log file is already exist:" /foo/bar/debug_`date '+%Y%m%d'`.log
fi

# Start deamons.【4】
swatch -c ~/.swatch/.swatchrc -t /foo/bar/debug_`date '+%Y%m%d'`.log --pid-file ~/.swatch/pid --script-dir ~/.swatch --daemon
if [ $? -eq 0 ]; then
    echo "Swatch is restarting"
else
    echo $?
fi

exit

Swatch関連のファイルが多くなってきたので、管理の都合上ユーザーのホームディレクトリ直下.swatchというディレクトリにまとめることにした。
まず【1】で必要な環境変数をexportしておく。cronだと.bash_profileに追加した環境変数が読み込まれないため。
次にで【2】プロセスIDを記載したファイルの有無からSwatchの起動状況を判断し、catした結果からプロセスをkill、その後関連するファイルを念のためrmしておく。
さら【3】のパートにて監視対象ログファイル存在をチェックしている。ログファイルが確実に存在しないとSwatchがエラーでこけそうだったので、ログファイルが存在しない場合には先にshellユーザ権限で作成する。通常ログファイルはapacheユーザの権限で作成されるため、パーミッションを666にする。
最後に【4】でSwatchを各種オプションをつけて起動。--pid-fileでプロセスIDをファイルに保存し--script-dirで起動時に生成されるファイルの保存場所を指定。すべて.swatch以下にまとめる。何かしら処理が途中で停止した場合にはその内容をechoさせる。

この内容をファイルとして保存しcronへ0時に実行されるよう登録する。Swatchが起動していない状況なら起動用としても使えるので便利。

検証結果

試行錯誤で修正を加えながらテスト運用してみて、恐らくこれで大丈夫だろう、という感じ。肝はcronで処理を回す時に.bashrcや.bash_profileが読み込まれなかったために、想定していたコマンドが走らなかったことだった。

*1:しかしshell scriptは組込コマンドがばしばし使えてマスターすると本当に便利そうだ。