ありそうでないのが 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