読者です 読者をやめる 読者になる 読者になる

M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

JP1/AJS2 起動条件中のファイル監視ジョブの難しさ

前提

仕事で保守しているシステムでバッチ・システムの実行管理にJP1/AJS2を使用している。バッチの中でも数分間隔で、ただしシングルスレッドで起動させたいものは以下のスケジュールルール設定をした上で計画実行を行っている:

  • [種別]は「絶対日」
  • [開始年月]は任意(ただし実行登録日以前)
  • [開始時刻]は「絶対時刻」の任意時間(例えば8:00)
  • [処理サイクル」は「サイクルで実行する」かつ「1日毎に実行する」
  • [起動条件]は「設定されていれば使用する」
  • [起動条件の有効範囲]は[時間]が「絶対時刻」で任意時刻(例えば22:00)

ルートジョブネットの詳細定義で[多重起動]は「不可能」に設定している。
また起動条件ユニットの設定で、起動条件を設定したジョブネットが異常終了したときの動作として、「ジョブネットの実行を開始する」が指定されている(この指定の理由は不明。どちらかと言えば「起動条件の監視を停止する」が適切に思われる)。

そして起動条件ユニット(.CONDITION)配下に置いたファイル監視ジョブで、ジョブネットの起動を制御するためのファイル(制御ファイル。内容は作成/リネーム日時が記載されているだけ)監視させている。監視条件は以下のとおり:

  • [監視対象ファイル名]は任意のファイルパス(例えば D:\\batch_ctrl_file\xxxx0000\start.txt )
  • [監視条件]は「作成」「既存ファイルも条件成立」と「最終書き込み時刻変更」

ジョブネットの本体(起動条件ユニットでない部分)では先頭部で制御ファイルをリネーム(start.txt→stop.txt)し、終端部で再度制御ファイルをリネーム(stop.txt→start.txt)して元に戻している。

したがって仮に本体内で異常終了が発生したりすると、制御ファイルはリネームされたままとなり、多重起動はもとより不可能であるにしても、復旧を待たず翌日を迎えた場合でもジョブネットが勝手に起動したりしないようにしてある。

本題

この設定のなかで直近問題となったのがファイル監視ジョブの監視条件「最終書き込み時刻変更」であった。この設定が選択されていない(チェックONになっていない)ものが本番運用中のジョブネットのなかに存在した。

この設定になっている場合、制御ファイルが起動OKをあらわす状態であるにもかかわらず監視条件が成立せず、ステータスが「監視中」のままジョブネット本体の起動がならないというケースが見られた。

あれこれ調べていくとこれはJP1/AJS2(おそらくAJS3も該当)の仕様であることがわかった。

仕様1

ジョブネットに起動条件(.CONDITION)が存在し、ルートジョブネットの設定で起動条件が「設定されていれば使用する」となっているとき、ジョブネット本体の起動は起動条件ユニット配下に置かれたイベント監視系ジョブの監視条件成立をトリガーとする(当たり前)。

仕様2

  • このとき起動条件配下のユニットの実行回をあらわす「監視世代」とジョブネット本体の実行回をあらわす「実行世代」は独立に管理される。
  • そして監視世代はスケジュールルールの有効範囲内で常に1世代しか存在せず、その1世代が有効範囲の終わりまで生き続ける。
  • 監視世代により定期的に監視条件がチェックされ条件満了をすると、それをトリガーにジョブネット本体の実行世代が新たに生成される。
  • 監視世代はそのまま継続し、監視間隔の設定で定められた秒数待機した後に再度監視条件がチェックされ、もし条件満了となればまた実行世代が新たに生成される。監視世代はそのまま継続し・・・(繰り返し)。
  • したがって監視世代:実行世代=1:N。

f:id:m12i:20160403114105p:plain

仕様3

  • 「既存ファイルも条件成立」は「監視開始オプション」と呼ばれる。
  • その名の通り「監視世代の生成時(=ジョブネットの実行登録時)にすでにファイルが存在した」という状態を検知し反応(条件成立)する。
  • しかし「1つ前の条件成立チェック時にすでにあった」という状態は検知せず反応しない(監視中のまま)。

f:id:m12i:20160403114822p:plain

上図のチェック1回目と4回目に注目。JP1/AJS2の仕様の紛らわしいところ──しかし理不尽な仕様ではない──は「監視世代」の概念やライフサイクルを理解していないと、監視条件の「既存ファイルも条件成立」の意味を取り違えてしまうことである。もし「監視世代」が「実行世代」同様に都度々々新規に開始され終了されるものであれば、「既存ファイルも条件成立」をONにしておくことで、チェック4回目でも(B)は成立するはずである。

f:id:m12i:20160403114908p:plain

実際には前述のとおり、「監視世代」はあるスケジュールルールの有効範囲内で一度開始されたあと有効範囲の終わりまで生き続けるので、「既存ファイルも条件成立」ではチェック4回目の状況では条件成立とならない。