いままではJobSchedulerでジョブやジョブチェーンを時間指定で起動する方法について見てきました。
時間指定での起動ならcronでも出来ます(もちろん、cronでは出来ない高度な時間指定がJobSchedulerでは可能ですが)。
では、ディレクトリにファイルが出来たらジョブを起動するといったことはどうでしょうか。
実務では、かなり多いケースだと思います。cronでやるなら定期的にジョブを起動して、ファイルがあれば処理をするといった方法を考えるでしょう。デーモンを作ることで解決する場合もあります。
JobSchedulerは、ディレクトリを監視する機能があります。さらに、処理済みとなったファイルを削除したり、指定したディレクトリに移動する機能もあるのです。
ファイルを処理するジョブを作る
まず、ファイルを処理するジョブを作ります。ジョブのつくり方は、SOS JobSchedulerでジョブを作ってみようを参考にしてください。
ジョブの名前は、単純にFileProcessJobとしました。ファイルを処理するといっても、ファイル名を表示するだけの単純なものです。
FILES=$SCHEDULER_TASK_TRIGGER_FILES
echo "FILES: $FILES"
exit 0
ディレクトリにファイルが出来たら、このジョブが起動されるようにするのですが、その際のファイルパスは$SCHEDULER_TASK_TRIGGER_FILESで取得できます。
ジョブチェーンでディレクトリ監視を設定する
次のジョブチェーンを作ります。ジョブチェーンのつくり方は、SOS JobSchedulerでジョブチェーンを作るを参考にしてください。
ジョブチェーンの名前は、これも単純にFileProcessChainとしました。
ジョブチェーンのSteps/Nodesの設定画面(もうお馴染みですね)の下の方に、File Order Sources for…という部分があるでしょう。ここで、ディレクトリ監視が設定できます。
Directory: 監視するディレクトリを指定します
Regex: ディレクトリ内で監視するファイル名を正規表現で指定します
Next State: ファイルが見つかった場合に遷移するStateを指定します
処理が終わったらファイルを削除する
Step/Nodesの全貌はこのようになります。
ディレクトリ監視で設定したように、ファイルが見つかったらstep-1に状態遷移しますので、FileProcessJobが実行されます。ジョブが正常終了したら、successに状態遷移するのですが、success状態のノードタイプがいままでのようにEnd Nodeではなく、File Sinkになっています。
File Sinkは、次の状態を持てないのでEnd Nodeの一種と言えますが、同時にファイルの削除もしくは移動を指定できます。上図ではRemove Fileにチェックを入れているので、ディレクトリ監視で見つかったファイルを削除してからジョブチェーンを終了するのです。
ちなみに、ファイルを移動するには、Move toに移動先のパスを指定します。
動かしてみる
いままで、ジョブチェーンを実行するためにはオーダー(Job Chain Order)を作ってきました。しかし、ディレクトリ監視の場合はオーダーを作る必要はありません。
上記のJOE(JobScheduler Object Editor)での設定を保存すれば、それでディレクトリ監視が始まります。
ここで、/home/scheduler/rcvにファイルを作ってみましょう。
cd /home/scheduler/rcv
touch 12.txt
JOC(JobScheduler Operation Centre)を見てみます。
どうやら、起動したようです。さらに、ログも見てみましょう。
2013-01-18 08:11:03.291 [info] (Task test/FileProcessJob:536) FILES: /home/scheduler/rcv/12.txt
2013-01-18 08:11:03.324 [info] SCHEDULER-979 Removing file /home/scheduler/rcv/12.txt
思いっきり抜粋したログですが、FileProcessJobで出力したファイルパスが確認できます。
さらに、FileProcessChainで指定したジョブチェーン終了時のファイル削除もログに残っています。