Scrapdiary

DesigningとEngineeringの架け橋

モジュール&Swatchの手動インストール + ログローテートへの対応

本環境ではPerlの構成が自分にとっては不規則だったため、どうにもSwatchが言うことを聞いてくれない。要は正確にPATHが通っていないとう状況だった。先日調べた結果を元に何とかPATHを通すことが出来た。
root、sudoもないため、当初は足りないモジュールをlocal::libを利用してCPAN経由でインストールしようかと考えていた。しかしこのサーバが都合で外(インターネット)に出れないためにCPANを断念。自分でソースからmakeしてinstallすることにしてみた。
ユーザ配下のディレクトリにモジュールをインストールするため、Perlへモジュールの位置を知らせる必要がある。環境変数PERL5LIBにPATHを.bash_profile等に追加しておくことでログイン時に常に環境変数が自動設定される。

export PERL5LIB=$HOME/local/lib/perl5:$HOME/local/lib/perl5/i686-linux

今回はlocal::libを使うつもり満々だったのでディレクトリ構成はそちらから引用。適宜ケースに応じて書き換える。

不足モジュールのインストール

Makefile.PLに記載されているように、現行最新バージョンのSwatch 3.2.2で必要なモジュールは以下の通り。(カッコ内はバージョン指定)

  • Time::HiRes(1.12以上)
  • Date::Calc(なし)
  • Date::Format(なし)
  • Date::Manip(なし)
  • File::Tail(なし)
  • Term::ANSIColor(なし)

CPANが使えないのでインストール済みのモジュールを確認する場合にはコマンドで

$ find `perl -e 'print "@INC"'` -name '*.pm' -print
$ find `perl -e 'print "@INC"'` -name 'foo.pm' -print

とすることで検索することが可能。上は全てのモジュール、下はモジュール名指定で検索の場合。下記より参照。便利です。

自分的にちょっとしたTIPSだったんだけど、makeに「-n」オプションをつけることで、どこにインストールするかを事前に教えてくれる。ログとして残して置くと後で参照することが出来るので便利。インストールは下記の手順で行った。

$ tar zxf foo-bar-2.0.tar.gz
$ cd foo-bar-2.0
$ perl Makefile.PL INSTALL_BASE=$HOME/local
$ make test
$ make -n install > Makelog
$ make install

手動で行うのは各モジュールの依存関係のためかなりの手間。CPANがもたらす簡易性の恩恵がいかに素晴らしいかを実感した。反面、自分でmake〜make test〜make installと手順を追っていくと、CPANが自動で行っている部分*1の中身が少しわかり勉強になった。

Swatchのインストール

こちらもモジュールとまったく同様の手順。

$ tar zxf swatch-3.2.2.tar.gz
$ cd swatch-3.2.2
$ perl Makefile.PL INSTALL_BASE=$HOME/local
$ make test
$ make -n install > Makelog
$ make install

Makefileを作る時点で足りないモジュールがあればwarningで知らせてくれるので、それがなければ問題なくインストールできる。コマンドラインからの呼び出しが楽なようにPATHを通すため.bash_profile等に追記。

export PATH=$PATH:$HOME/local/bin

INSTALL_BASEで設定したディレクトリ以下のbinにインストールされるため。これでどこでもswatchと入力すれば呼び出されるようになる。

監視対象ログファイルのローテートを想定

当初Swatchのrestart機能でログファイルを切り替えようと考えていたが、知識不足で想定が甘かったため断念。プロセスIDをチェックしてkillするscriptを書こうと思ったが敷居が高い・・・。ちょっとローテクだけど別の角度からのいいアイディアがあったので、こちらを参考にしてみた。Swatchが監視対象とするのは実際のログファイルへのシンボリックリンクに設定し、毎日0時にローテートされるログファイルに対応してシンボリックリンクを更新しようという発想。

#!/bin/sh
rm ~/.swatch_log_link
LOG_FILE=/foo/bar/log/debug_`date '+%Y%m%d'`.log
ln -s $LOG_FILE ~/.swatch_log_link

ただし既にシンボリックリンクが存在する場合は処理がコケるので、rmで一度削除する処理を追加した。これをファイルとして保存し、0時に走るようcrontabへ登録する。

(追記)上記のシンボリックリンクを用いた方法だと、日付切替後にシンボリックリンクの対象先ファイルは正確に更新されるのだが、Swatch自身がログファイルを見失ってしまい監視が行われないことが実検証で判明。解決方法は別途エントリーを参照のこと。

Swatchの起動

ログファイルに対しての設定ファイル(ここでは基本どおり「.swatchrc」)を作成したら、daemonオプションをつけてSwatchを起動させる。

$ swatch -c .swatchrc -t /foo/bar/.swatch_log_link --daemon

これでSwatch側からはログファイルの変更をきにすることなく監視を続けてくれる。後は設定ファイルでアクションやパターンといった監視内容を精査すれば一応の完成。

やっとここまできた。たかが一つのPerlアプリをインストールするだけだったけど、かなり勉強になりました。

*1:CPANでもログが流れるが、早すぎて人間の目には追えない。自分で手動でやってみて初めてCPANの便利さがわかるかも。viva CPAN!