ログローテーションに対応した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は組込コマンドがばしばし使えてマスターすると本当に便利そうだ。