ある時、気づくと、あるバッチプログラムがMSGWになっています。ああ誰かずっと監視していてくれないかな。はい、これです。これは、Never
end programで、一度SBMJOBすると、ジョブキャンセルするまで、動きつづけます
ジョブチェッカーのダウンロード
/* JOB CHECKER */
/* */
/* 1.CHECKED JOBS ARE BATCH TYPE OR INTERACTIVE TYPE ONLY. */
/* 2.THIS PROGRAM DOES NOT TERMINATE.THEN THIS PROGRAM SHOULD BE */
/* ACTIVE IN BATCH ENVIRONMENT ONLY. */
/* 3.IF YOU WANT TO TERMINATE THIS PROGRAM,CANCEL IT BY "ENDJOB". */
/* 4.YOU SHOULD CREATE THIS PROGRAM WITH LOG(*NO) IN CRTCLPGM. */
/* */
/* BY T.KAKEFUDA 92.06.09 */
/* */
PGM (&STATUS &PRINT &MESSAGE &TOUSR)
DCL &STATUS *CHAR 14 /* PARM. CHECKED JOB-STATUS */
DCL &STS1 *CHAR 4
DCL &STS2 *CHAR 4
DCL &STS3 *CHAR 4
DCL &PRINT *CHAR 4 /* PARM. DO DSPJOB OUTFILE(*PRINT)? */
DCL &MESSAGE *CHAR 4 /* PARM. SEND INFORMATION ? */
DCL &TOUSR *CHAR 32 /* PARM. TO WHOM SEND MESSAGE ? */
DCL &TOUSR1 *CHAR 10
DCL &TOUSR2 *CHAR 10
DCL &TOUSR3 *CHAR 10
DCL &USR_SPACE *CHAR 20 'JOBLIST QTEMP '
DCL &JOB_JOB *CHAR 26 '*ALL *ALL *ALL '
DCL &JOB_STS *CHAR 10 '*ACTIVE'
DCL &JOB_JOBI *CHAR 26 '*INT '
DCL &JOB_INFO *CHAR 52
DCL &JOB_NAME *CHAR 10
DCL &JOB_USER *CHAR 10
DCL &JOB_JOBNO *CHAR 6
DCL &JOB_FULL *CHAR 28
DCL &JOB_INT# *CHAR 16
DCL &JOB_TYPE *CHAR 1
DCL &JOB_STATUS *CHAR 4
DCL &RTV_DATA *CHAR 16
DCL &RCV_DATA *CHAR 111
DCL &MSG *CHAR 250
/* FOR DECIMAL */
DCL &RTV_START *DEC (9 0)
DCL &RTV_LNGTH *DEC (9 0)
DCL &LST_OFFSET *DEC (9 0)
DCL &LST_COUNT *DEC (9 0)
DCL &LST_SIZE *DEC (9 0)
DCL &WRK_COUNT *DEC (5 0) /* COUNTER */
/* FOR BINARY */
DCL &RTV_STARTB *CHAR 4
DCL &RTV_LNGTHB *CHAR 4
DCL &LST_OFSETB *CHAR 4
DCL &LST_COUNTB *CHAR 4
DCL &LST_SIZEB *CHAR 4
MONMSG CPF0000 *N GOTO RETURN
/*--------------------------------------*/
/* INITIALIZE ROUTINE */
/*--------------------------------------*/
/* &STATUS IS RESOLVED INTO 3 WORK FIELDS */
CHGVAR &STS1 %SST(&STATUS 3 4)
CHGVAR &STS2 %SST(&STATUS 7 4)
CHGVAR &STS3 %SST(&STATUS 11 4)
IF (&MESSAGE ='*YES') DO
CHGVAR &TOUSR1 %SST(&TOUSR 3 10)
CHGVAR &TOUSR2 %SST(&TOUSR 13 10)
CHGVAR &TOUSR3 %SST(&TOUSR 23 10)
IF (&TOUSR1='*REQUESTER') RTVUSRPRF MSGQ(&TOUSR1)
IF (&TOUSR2='*REQUESTER') RTVUSRPRF MSGQ(&TOUSR2)
IF (&TOUSR3='*REQUESTER') RTVUSRPRF MSGQ(&TOUSR3)
IF (&TOUSR1 *NE ' ') CHKOBJ &TOUSR1 *MSGQ
IF (&TOUSR2 *NE ' ') CHKOBJ &TOUSR2 *MSGQ
IF (&TOUSR3 *NE ' ') CHKOBJ &TOUSR3 *MSGQ
ENDDO
/*--------------------------------------*/
/* MAIN ROUTINE */
/*--------------------------------------*/
/* CREATE USER SPACE */
CHKOBJ %SST(&USR_SPACE 11 10)/%SST(&USR_SPACE 1 10) *USRSPC
MONMSG CPF9801 *N CALL QUSCRTUS +
(&USR_SPACE 'WRK ' X'00001000' ' ' '*ALL' 'WORK USER SPACE')
/* SET A JOB LIST INTO THE USER SPACE */
RETRY:
CHGVAR &WRK_COUNT 0
CALL QUSLJOB (&USR_SPACE 'JOBL0100' &JOB_JOB &JOB_STS)
/* RETRIEVE HEADER INFORMATION OF THE JOB LIST FROM THE USER SPACE */
CHGVAR %BIN(&RTV_STARTB) 125
CHGVAR %BIN(&RTV_LNGTHB) 16
CALL QUSRTVUS (&USR_SPACE &RTV_STARTB &RTV_LNGTHB &RTV_DATA)
CHGVAR &LST_COUNTB %SST(&RTV_DATA 9 4)
CHGVAR &LST_COUNT %BIN(&LST_COUNTB)
IF (&LST_COUNT = 0 ) GOTO NEXT /* NO DATA IN THE LIST */
CHGVAR &LST_OFSETB %SST(&RTV_DATA 1 4)
CHGVAR &LST_OFFSET %BIN(&LST_OFSETB)
CHGVAR &LST_SIZEB %SST(&RTV_DATA 13 4)
CHGVAR &LST_SIZE %BIN(&LST_SIZEB)
CHGVAR &RTV_START (&LST_OFFSET + 1)
CHGVAR %BIN(&RTV_STARTB) &RTV_START
CHGVAR &RTV_LNGTH &LST_SIZE
CHGVAR %BIN(&RTV_LNGTHB) &RTV_LNGTH
/* RETRIEVE LIST DATA FROM THE USER SPACE */
RTV_JOB:CHGVAR &WRK_COUNT (&WRK_COUNT + 1) /* COUNT UP */
CALL QUSRTVUS (&USR_SPACE &RTV_STARTB &RTV_LNGTHB &JOB_INFO)
/* GET THE JOB INFORMATION BY RETRIEVED DATA. */
CHGVAR &JOB_INT# %SST(&JOB_INFO 27 16)
CALL QUSRJOBI (&RCV_DATA X'0000006F' 'JOBI0200' &JOB_JOBI &JOB_INT#)
MONMSG CPF0000 *N GOTO SKIP
CHGVAR &JOB_TYPE %SST(&RCV_DATA 61 1)
CHGVAR &JOB_STATUS %SST(&RCV_DATA 108 4)
/* IF IT IS BATCH JOB OR IT IS INTERACTIVE JOB,CHECK STATUS OF IT.*/
IF (&JOB_TYPE='B' | &JOB_TYPE='I') DO
IF (&JOB_STATUS=&STS1 | &JOB_STATUS=&STS2 | &JOB_STATUS=&STS3) DO
CHGVAR &JOB_NAME %SST(&RCV_DATA 9 10)
CHGVAR &JOB_USER %SST(&RCV_DATA 19 10)
CHGVAR &JOB_JOBNO %SST(&RCV_DATA 29 6)
IF (&JOB_NAME='QSYSMSG_CK') GOTO SKIP /*例外*/
IF (&PRINT ='*YES') DSPJOB &JOB_JOBNO/&JOB_USER/&JOB_NAME *PRINT
IF (&MESSAGE='*YES') DO
CHGVAR &JOB_FULL (&JOB_NAME|<'/'|<&JOB_USER|<'/'|< &JOB_JOBNO)
CHGVAR &MSG +
('ジョブ'|<&JOB_FULL|<'が'|<&JOB_STATUS|<'です! ')
IF (&TOUSR1 *NE ' ') SNDPGMMSG MSG(&MSG) TOUSR(&TOUSR1)
IF (&TOUSR2 *NE ' ') SNDPGMMSG MSG(&MSG) TOUSR(&TOUSR2)
IF (&TOUSR3 *NE ' ') SNDPGMMSG MSG(&MSG) TOUSR(&TOUSR3)
ENDDO
ENDDO
ENDDO
SKIP: IF (&LST_COUNT = &WRK_COUNT) GOTO NEXT
CHGVAR &RTV_START (&RTV_START + &LST_SIZE)
CHGVAR %BIN(&RTV_STARTB) &RTV_START
GOTO RTV_JOB
/* RETRY AFTER 10 MINUTES */
NEXT:
DLYJOB DLY(600)
GOTO RETRY
RETURN: RETURN
ENDPGM
CMD PROMPT('JOB STATUS CHECK')
PARM KWD(STATUS) TYPE(STSLIST) PROMPT('JOB STATUS')
PARM KWD(PRINT) TYPE(*CHAR) LEN(4) RSTD(*YES) +
DFT(*YES) VALUES(*YES *NO) PROMPT('PRINT +
JOBLOG')
PARM KWD(MSG) TYPE(*CHAR) LEN(4) RSTD(*YES) +
DFT(*NO) VALUES(*YES *NO) PROMPT('SEND +
MESSAGE')
PARM KWD(TOUSR) TYPE(USRLIST) PROMPT('USER NAME')
DEP CTL(MSG *EQ *YES) PARM((TOUSR))
STSLIST: ELEM TYPE(*CHAR) LEN(4) RSTD(*YES) DFT(*MSGW) +
SPCVAL((*MSGW MSGW) (*LCKW LCKW) (*SRQ +
SRQ) (*NONE NONE))
ELEM TYPE(*CHAR) LEN(4) RSTD(*YES) DFT(*LCKW) +
SPCVAL((*MSGW MSGW) (*LCKW LCKW) (*SRQ +
SRQ) (*NONE NONE))
ELEM TYPE(*CHAR) LEN(4) RSTD(*YES) DFT(*SRQ) +
SPCVAL((*MSGW MSGW) (*LCKW LCKW) (*SRQ +
SRQ) (*NONE NONE))
USRLIST: ELEM TYPE(*NAME) LEN(10)
ELEM TYPE(*NAME) LEN(10)
ELEM TYPE(*NAME) LEN(10)
|