Scrapdiary

DesigningとEngineeringの架け橋

shell scriptとリスタート設定でSwatchを動かす

先日検証したSwatch、実際のログデータのファイルは日毎に「debug_20090722.log」のような形で生成されているので、通常のSwatchの起動方法だとファイル名の変更に対応できない。
そこで最初に考えたのがSwatchの起動処理を記述したshell scriptをcronで毎0時に実行する方法を考えてみた。UNIXコマンドをちょっと知ってるくらいでshell scriptをほぼ分らない。まずは変数の使い方や制御構文など基礎をちょっと調べてみた。ハマったのが変数宣言で「=」の前後にはスペースを入れてはいけないということ。試しにhello world的なものを書いてみた。

#!/bin/bash
TIME=`date '+%Y%m%d' 2>&1`
swatch -t debug_$TIME.log
exit 0
# swatch -t debug_20090722.log と解釈され処理が実行される

しかしこれだとプロセスが日毎に立ち上がり、リソースの無駄になってしまう。再起動の方法がないものかとSwatchのperldocを確認したとろこ、こんなオプションがあった。

--restart-time=[+]hh:mm[am│pm] or -r [+]hh:mm[am│pm]

説明では以下のように書いてある。

Restart at the specified time where hh is hours and mm is minutes. If the am/pm indicator is omitted, then a 24-hour clock is assumed. If the time is preceded by the "+" character, then the restart time will be set to the current time plus the specified time and the am/pm indicator will be ignored.

「am | pm」の記述があれば午前・午後での時間指定となり、設定時間の前に「+」の記述があれば、現在時刻*1から設定した時間の後にrestartがかかる模様。これとshell scriptを組み合わせればいい。

$ swatch -c /home/hoge/.swatchrc -t /foo/bar/debug_`date '+%Y%m%d'`.log -r 00:00 --daemon
Will restart at Thu Jul 23 00:00:00 2009

これで理論上は毎0時に監視対象のファイルを切り替えてrestartしてくれるはず。ということでメモとして。今度検証してみよう。くれることを期待していたのだけれど、restartした後も監視対象ファイルは起動時に指定されたものと同一のままだった。

追記

起動コマンド実行時には自動でコマンドが実行された日付を取得・補完してくれたのだが、一度Swatchに渡されたコマンドは

swatch -c /home/hoge/.swatchrc -t /foo/bar/debug_20090722.log -r 00:00 --daemon

となる。つまりshell scriptはあくまでコマンド実行時のみ有効であり、restartした時も上記と同じファイルが監視対象となるようだ。なかなかうまくいかない。毎回Swatchのプロセスをkillしてcronで新しく立ち上げ直す必要がありそう。勉強になります。

*1:manにはないけど、hh:mm:ss、つまり秒まで指定可能なようだ。