ありそうでないのが CHKJOB というコマンド。
CHKJOB コマンドは、指定した JOB 現在活動中であるかを検査する。
ジョブが活動中でないときは CPF9897 が *ESCAPE メッセージとして戻るので
例えば ユーザー CLP の中で
CHKJOB JOB(MYJOB) MONMSG CPF9800 DO SNDPGMMSG MSG('JOB IS NOT ACTIVE') ENDDO
のようにして検査することができる。
CMD PROMPT(' ジョブの活動検査 ') PARM KWD(JOB) TYPE(*NAME) LEN(10) MIN(1) + PROMPT(' ジョブ名 ')
PGM PARM(&CHKJOB) /*---------------------------------------------------------*/ /* CHKJOB : ジョブの活動検査 */ /*---------------------------------------------------------*/ DCL VAR(&MSG) TYPE(*CHAR) LEN(80) DCL VAR(&CHKJOB) TYPE(*CHAR) LEN(10) DCL VAR(&JOBUSRNBR) TYPE(*CHAR) LEN(26) DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) + VALUE(X'0000007D') /* 2 進数開始位置 : + 125 */ DCL VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数 */ DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(16) + VALUE(X'0000000000000000') DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* + 2 進数オフセット */ DCL VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* + 2 進数項目数 */ DCL VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* + 2 進数リストサイズ */ DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) + VALUE(X'00000010') /* 2 進数受取長さ : 16 */ DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(80) DCL VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */ DCL VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */ DCL VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */ DCL VAR(&NB) TYPE(*DEC) LEN(8 0) /* WORK */ DCL VAR(&JOB) TYPE(*CHAR) LEN(10) DCL VAR(&USR) TYPE(*CHAR) LEN(10) DCL VAR(&NBR) TYPE(*CHAR) LEN(6) DCL VAR(&JOBTYP) TYPE(*CHAR) LEN(1) DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) + VALUE(X'00000000') /* 2 進数 */ DCL VAR(&RESULT) TYPE(*CHAR) LEN(1) VALUE('0') MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) /*( ユーザー・スペースの作成 )*/ CALL PGM(QUSCRTUS) PARM('USLJOB QTEMP ' + 'PF ' 1000 ' ' '*ALL ' + 'QUSLJOB 用ユーザー空間 ' '*YES ' &APIERR) /*( QUSLJOB API : すべての JOB リストを検索 )*/ CHGVAR VAR(&JOBUSRNBR) VALUE('*ALL *ALL + *ALL ') CALL PGM(QUSLJOB) PARM('USLJOB QTEMP ' + 'JOBL0100' &JOBUSRNBR '*ACTIVE' &APIERR) /*( ユーザー・スペースを検索 )*/ RTVUSRSPC: CHGVAR VAR(&N) VALUE(1) /*( 1. リストデータ・セクションのオフセット値を検索 )*/ CHGVAR VAR(%BIN(&STRPOS)) VALUE(125) CHGVAR VAR(%BIN(&DTALEN)) VALUE(16) CALL PGM(QUSRTVUS) PARM('USLJOB QTEMP ' + &STRPOS &DTALEN &RCVVAR) /*( 2. リストデータセクションの項目数を検索 )*/ CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4)) CHGVAR VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4)) CHGVAR VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4)) /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/ CHGVAR VAR(&STRPOS) VALUE(&OFFSET) CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) CHGVAR VAR(&DEC08) VALUE(&DEC08 + 1) CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) CHGVAR VAR(&LENDTA) VALUE(&LSTSIZ) CHGVAR VAR(&ADDLEN) VALUE(%BIN(&LENDTA)) CHGVAR VAR(&NOENT) VALUE(%BIN(&NOENTR)) CHGVAR VAR(&NB) VALUE(&N) /*( オフセット値 +1 から 26 バイトを検索してジョブ名を得る )*/ NXTRTV: CALL PGM(QUSRTVUS) PARM('USLJOB QTEMP ' + &STRPOS &LENDTA &RCVDTA) /*( 処理の開始 )*/ CHGVAR VAR(&JOB) VALUE(%SST(&RCVDTA 01 10)) CHGVAR VAR(&USR) VALUE(%SST(&RCVDTA 11 10)) CHGVAR VAR(&NBR) VALUE(%SST(&RCVDTA 21 6)) CHGVAR VAR(&JOBTYP) VALUE(%SST(&RCVDTA 53 1)) IF COND(&JOBTYP *NE 'M' *AND &JOBTYP *NE 'S') + THEN(DO) /* 除く SBS , システム */ IF COND(&JOB *EQ &CHKJOB) THEN(DO) CHGVAR VAR(&RESULT) VALUE('1') GOTO OUTRTV ENDDO ENDDO /* 除く SBS , システム */ /*( 処理の終了 )*/ IF COND(&N < &NOENT) THEN(DO) CHGVAR VAR(&N) VALUE(&NB + 1) CHGVAR VAR(&NB) VALUE(&N) CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) CHGVAR VAR(&DEC08) VALUE(&DEC08 + &ADDLEN) CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) GOTO NXTRTV ENDDO OUTRTV: IF COND(&RESULT *EQ '1') THEN(DO) SNDPGMMSG MSG(' ジョブ ' *CAT &CHKJOB *TCAT + ' は活動中です。 ') MSGTYPE(*COMP) ENDDO ELSE CMD(DO) SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) + MSGDTA(' ジョブ ' *CAT &CHKJOB *TCAT + ' は活動中していません。 ') MSGTYPE(*ESCAPE) ENDDO RETURN ERROR: RCVMSG RMV(*NO) MSG(&MSG) SNDMSG: SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) ENDPGM