活動ジョブの検査

大昔 (おそらく V4R3 とかその頃) IBM の SE さんからもらったツールをまた使う機会があり、しかも V5R1 でも使えたのでちょっと紹介します。
(人の人を介してもらったツールですが、このページへの転載の許可は得てますので)

システム上であるジョブが生きているかどうか、その場合どういう状態かを判別するツールです。
常駐ジョブのチェックなどに使用しました。

具体的には以下のようなコマンド画面になっています。
以下のようにジョブ名を指定したり、ユーザーを指定したり、番号までを含めた特定のジョブを指定したりできます。
「ジョブ状況」というのは、コマンドプロンプトの右にあるようにアクティブか出力待ち行列の中にあるか、ジョブ待ち行列で待っているのか、それともそのすべてか、を指定します。

コマンドとコマンド処理プログラム、結果はファイルに書き出されるのでそのファイル、そしてそのファイルにコマンド処理プログラムから書き出すためだけのプログラムがあります。実行時にはこのすべてがライブラリーリストに存在している必要があります。
結果の書き出しについては QCHKACTJ というファイルになっていますが、コマンド処理プログラムを見て名前は変更することも可能です。
最終的には別にファイルに書き出さなくてもいいし、自由に使えるようにということでこういう形にしてあるそうです。

ファイルの書き出しのために RPG プログラムをいちいち呼び出す構造のため、ILE RPG を使用して CL からは CALLPROC で呼び出しています。そのため、CRTCLMOD/CRTRPGMOD コマンドを使用してそれぞれをコンパイルして CRTPGM コマンドでリンクする、ということを行っています。

コマンドの実行結果はとりあえず QCHKACTJ というファイルに書き出されますので QUERY かなんかで検索します。

たとえば CHKACTJOB コマンドで「ジョブ状況」は「*ALL」にしておいて、QUERY で以下のように「*ACTIVE」のものだけを検索することもできます。

結果はこんなかんじですね。

'*ACTIVE' のかわりに '*OUTQ' なんて指定すると結果はこんなかんじになります。

それぞれのソースです。

コマンド処理プログラムは CL なのでテキストでコピーしてます。
システム API の CL での処理の仕方という意味ではここからコピーしたり、ということもあるでしょうし。

             PGM        PARM(&PARM1 &STS)
             DCL        VAR(&FILE) TYPE(*CHAR) LEN(10)
             DCL        VAR(&PARM1) TYPE(*CHAR) LEN(26)
             DCL        VAR(&JOBPARM) TYPE(*CHAR) LEN(26)
             DCL        VAR(&JOB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&USR) TYPE(*CHAR) LEN(10)
             DCL        VAR(&NBR) TYPE(*CHAR) LEN(6)
             DCL        VAR(&STS) TYPE(*CHAR) LEN(10)
             DCL        VAR(&OBJ) TYPE(*CHAR) LEN(10)
             DCL        VAR(&USRSPC) TYPE(*CHAR) LEN(20) +
                          VALUE('CHKACTJOB QTEMP     ')
             DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(10)
             DCL        VAR(&USRNAME) TYPE(*CHAR) LEN(10)
             DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
             DCL        VAR(&JOBSTS) TYPE(*CHAR) LEN(10)
             DCL        VAR(&LSTJOBE) TYPE(*CHAR) LEN(52)
             DCL        VAR(&BIN4) TYPE(*CHAR) LEN(4)
             DCL        VAR(&ENTRY) TYPE(*DEC) LEN(8 0)
             DCL        VAR(&STR) TYPE(*DEC) LEN(8 0)
             DCL        VAR(&OFFSET) TYPE(*DEC) LEN(8 0)
             DCL        VAR(&OFFSETB) TYPE(*CHAR) LEN(4)
             DCL        VAR(&ENTLEN) TYPE(*DEC) LEN(8 0)
             DCL        VAR(&ENTLENB) TYPE(*CHAR) LEN(4)
             CHGVAR     VAR(&JOB) VALUE(%SST(&PARM1 1 10))
             CHGVAR     VAR(&USR) VALUE(%SST(&PARM1 11 10))
             CHGVAR     VAR(&NBR) VALUE(%SST(&PARM1 21 6))
             IF         COND(&JOB = '          ') THEN(CHGVAR +
                          VAR(&JOB) VALUE('*ALL     '))
             IF         COND(&USR = '          ') THEN(CHGVAR +
                          VAR(&USR) VALUE('*ALL     '))
             IF         COND(&NBR = '      ') THEN(CHGVAR VAR(&NBR) +
                          VALUE('*ALL  '))
             IF         COND(&STS = '          ') THEN(CHGVAR +
                          VAR(&STS) VALUE('*ALL     '))
             CHGVAR     VAR(&OBJ) VALUE(%SST(&USRSPC 1 10))
             DLTUSRSPC  USRSPC(QTEMP/&OBJ)
             MONMSG     MSGID(CPF0000)
             CLRPFM     FILE(QCHKACTJ)
             CALL       PGM(QUSCRTUS) PARM(&USRSPC 'CHKACTJOB ' +
                          X'00000100' ' ' '*ALL      ' 'CHKACTJOB +
                          TEMPORARY USER SPACE')
             CHGVAR     VAR(%SST(&JOBPARM 1 10)) VALUE(&JOB)
             CHGVAR     VAR(%SST(&JOBPARM 11 10)) VALUE(&USR)
             CHGVAR     VAR(%SST(&JOBPARM 21 6)) VALUE(&NBR)
             CALL       PGM(QUSLJOB) PARM(&USRSPC 'JOBL0100' +
                          &JOBPARM &STS)
             CALL       PGM(QUSRTVUS) PARM(&USRSPC X'00000085' +
                          X'00000004' &BIN4)
             CHGVAR     VAR(&ENTRY) VALUE(%BIN(&BIN4))
             IF         COND(&ENTRY = 0) THEN(GOTO CMDLBL(NOJOB))
             CALL       PGM(QUSRTVUS) PARM(&USRSPC X'00000089' +
                          X'00000004' &ENTLENB)
             CHGVAR     VAR(&ENTLEN) VALUE(%BIN(&ENTLENB))
             CALL       PGM(QUSRTVUS) PARM(&USRSPC X'0000007D' +
                          X'00000004' &OFFSETB)
             CHGVAR     VAR(&OFFSET) VALUE(%BIN(&OFFSETB))
             CHGVAR     VAR(&STR) VALUE(&OFFSET + 1)
 DO:         CHGVAR     VAR(%BIN(&BIN4)) VALUE(&STR)
             CALL       PGM(QUSRTVUS) PARM(&USRSPC &BIN4 &ENTLENB +
                          &LSTJOBE)
             CHGVAR     VAR(&JOBNAME) VALUE(%SST(&LSTJOBE 1 10))
             CHGVAR     VAR(&USRNAME) VALUE(%SST(&LSTJOBE 11 10))
             CHGVAR     VAR(&JOBNBR) VALUE(%SST(&LSTJOBE 21 6))
             CHGVAR     VAR(&JOBSTS) VALUE(%SST(&LSTJOBE 43 10))
             CHGVAR     VAR(&FILE) VALUE('QCHKACTJ')
       /*    CALL       PGM(WRITEFILE) PARM(&JOBNAME &USRNAME +
                          &JOBNBR &JOBSTS)                        */
             CALLPRC    PRC(WRITEFILE) PARM(&JOBNAME &USRNAME +
                          &JOBNBR &JOBSTS)
             CHGVAR     VAR(&STR) VALUE(&STR + &ENTLEN)
             CHGVAR     VAR(&ENTRY) VALUE(&ENTRY - 1)
             IF         COND(&ENTRY = 0) THEN(GOTO CMDLBL(NOJOB))
             GOTO       CMDLBL(DO)
 NOJOB:      ENDPGM

RPG は桁がずれると見にくい、というか意味をなさないので画面のコピーにしました。
このページからのコピーはできませんが、このソースを利用することもあまりないでしょうし ...

書き出すファイルのレイアウトです。
DDS も RPG と同様に位置が変わると意味がないので画面のコピーにしました。理由は RPG の場合と同様です。

コマンドのソースです。
こちらはひと画面に収まっていたので画面のコピーにしました。こちらもこのページからコピーすることもないでしょうし。

V5R1 で保管した SAVF はこちらです。
バイナリで FTP して復元すれば使用できるはずです。

ちなみに、このプログラムはたんなるサンプルでなんの保証もありませんし、使用するのはあくまで使用者の責任において使ってください。上記の内容を使用者が再確認するために、またはこれを参考にして各自で新しくユーティリティ等をつくれるように、ということでここに載せてあるものです。
プログラムの作成者、また転載者(つまり私)はこのプログラムを使用した結果については責任を負うものではありませんので、そこのところよろしくです。

[Top Pageに戻る]

Ads by TOK2