対話型ジョブを監視するプログラムの見直し ~ WRKACTJOBはもう古い ~
Question
弊社環境では、制御サブシステムがQBASEで動いているため、夜間バッチ処理の前に、対話型ジョブを監視して終了させるプログラムを実行しています。ですが、先日ENDJOBでエラーになる現象が発生しました。
プログラムの内容は、WRKACTJOBをスプール出力し、それを読み取り対話型ジョブに対してENDJOBしているのですが、ステータスなどの情報はあるのにジョブ名が拾えないという状況はあり得るのでしょうか。
Answer
調査しましたところ、そういった状況が発生する可能性がある事が分かりました。
例えば、アテンション・プログラムが呼び出された場合です。
これは、ESCキーを押した時、標準では「操作援助機能 (TM) メニュー」が呼び出されますが、それのことになります。
これを呼び出したときの状態をWRKACTJOBで確認しますと、ジョブ名に符号(+)が付いた状態になります。F14 キーを押すと、ジョブ名がブランクになっている行が確認できます。
WRKACTJOB をスプール出力すると、同様にジョブ名がブランクとなっていますので、これを拾ってENDJOBしている場合は、「CPF0001 コマンドでエラーが見つかった」のエラーとなってしまいます。
ただ、ブランクになっているジョブは、大元のジョブが終了すれば一緒に終了しますので、ENDJOBが実行されなくても問題ありません。
例えば「MONMSG CPF0001」を組み込むことで回避できるかと思います。
あるいは、WRKACTJOBを使用するという古い仕組みを改めるチャンスかもしれません。
現在では、SQL関数が用意されていますので、それを使用することで今回のようなエラーは発生しないものと思います。
SQL関数:QSYS2.ACTIVE_JOB_INFO()
https://www.ibm.com/docs/ja/i/7.5?topic=services-active-job-info-table-function
弊社環境には「QBASE」を制御サブシステムとしている環境が無いため、代わりにサブシステム「QINTER」のジョブ一覧を取得する構文を例とします。
SELECT *
FROM TABLE(QSYS2.ACTIVE_JOB_INFO()) AS X
WHERE SUBSYSTEM = 'QINTER'
アテンション・プログラムを呼び出しているジョブで比較してみましょう
ジョブ名が入った状態で情報取得できていることがわかるかと思います。
QSYS2.ACTIVE_JOB_INFO() は、現在サポートされているOSでは標準的にご利用いただけます。
この機会にプログラムを見直すのも一つの手かもしれませんね。
by かんぴょう木綿さん