要如何檢核某個 Job 的狀態並採取某些相對應動作 ? (Command: CHKACTJOB)
File : QCLSRC
Member: CHKACTJOB
Type : CLP
Usage : CRTCLPGM CHKACTJOB
/* =============================================================== */
/* = Command ChkJob CPP = */
/* = ChkJob CLP = */
/* = Paramater notes: = */
/* = Jobname : Jobname to check = */
/* = Jobuser : Jobuser to check = */
/* = SBS : Specified jobname running under which sbs = */
/* = Action : Change, End, Hold or Release job = */
/* = Job command option: only for Change or End job = */
/* = Other command : Other command for job = */
/* =============================================================== */
/* = Date : 2007/06/04 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
/* = Date : 2007/06/21 = */
/* = Author: Vengoal Chang = */
/* = Added on ACTION *MSG to send status message to user = */
/* =============================================================== */
/* = Date : 2007/08/08 = */
/* = Author: Vengoal Chang = */
/* = Added on JOBSTS keyword to limit job processing = */
/* =============================================================== */
/* = Date : 2007/08/14 = */
/* = Author: Vengoal Chang = */
/* = Added on ACTION *DSP to display job information = */
/* = DSPJOB OPTION(*ALL) OUTPUT(*PRINT) = */
/* = DSPJOB OPTION(*JOBLOG) OUTPUT(*PTINT) = */
/* =============================================================== */
CHKJOB: PGM PARM(&MYJOBNAME &JOBUSER &SBSDANDLIB &JOBSTS +
&ACTION &JOBOPT &TOUSR &CMD)
DCL VAR(&MYJOBNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBUSER ) TYPE(*CHAR) LEN(10)
DCL VAR(&SBSDANDLIB) TYPE(*CHAR) LEN(20) /* SBSD +
AND LIBRARY */
DCL VAR(&SBSD) TYPE(*CHAR) LEN(10) /* SBS */
DCL VAR(&SBSDLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&RTNSBSDLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBSTS) TYPE(*CHAR) LEN(5)
DCL VAR(&ACTION) TYPE(*CHAR) LEN(5)
DCL VAR(&JOBOPT) TYPE(*CHAR) LEN(3000)
DCL VAR(&TOUSR ) TYPE(*CHAR) LEN(10)
DCL VAR(&CMD ) TYPE(*CHAR) LEN(3000)
DCL VAR(&CMDSTR) TYPE(*CHAR) LEN(3000)
DCL VAR(&CMDLEN) TYPE(*DEC) LEN(15 5)
DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&USER) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
DCL VAR(&STATUS) TYPE(*CHAR) LEN(10)
DCL VAR(&JOBTYPE) TYPE(*CHAR) LEN(1)
DCL VAR(&SUBTYPE) TYPE(*CHAR) LEN(1)
DCL VAR(&USP_NAME) TYPE(*CHAR) LEN(10)
DCL VAR(&USP_LIB) TYPE(*CHAR) LEN(10)
DCL VAR(&USP_QUAL) TYPE(*CHAR) LEN(20)
DCL VAR(&USP_TYPE) TYPE(*CHAR) LEN(10)
DCL VAR(&USP_SIZE) TYPE(*CHAR) LEN(4)
DCL VAR(&USP_FILL) TYPE(*CHAR) LEN(1)
DCL VAR(&USP_AUT) TYPE(*CHAR) LEN(10)
DCL VAR(&USP_TEXT) TYPE(*CHAR) LEN(50)
DCL VAR(&API_USQUAL) TYPE(*CHAR) LEN(20)
DCL VAR(&API_JBQUAL) TYPE(*CHAR) LEN(26)
DCL VAR(&API_JBNAM) TYPE(*CHAR) LEN(10)
DCL VAR(&API_USER) TYPE(*CHAR) LEN(10)
DCL VAR(&API_JOBNR) TYPE(*CHAR) LEN(6)
DCL VAR(&API_STATUS) TYPE(*CHAR) LEN(10)
DCL VAR(&STARTPOS) TYPE(*CHAR) LEN(4)
DCL VAR(&DATALEN) TYPE(*CHAR) LEN(4)
DCL VAR(&HEADER) TYPE(*CHAR) LEN(150)
DCL VAR(&LST_OFFSET) TYPE(*DEC) LEN(5 0)
DCL VAR(&LST_SIZE) TYPE(*DEC) LEN(5 0)
DCL VAR(&LST_DATA) TYPE(*CHAR) LEN(4096)
DCL VAR(&LST_NBR) TYPE(*DEC) LEN(5 0)
DCL VAR(&LST_LEN) TYPE(*DEC) LEN(5 0)
DCL VAR(&LST_LENBIN) TYPE(*CHAR) LEN(4)
DCL VAR(&LST_POSBIN) TYPE(*CHAR) LEN(4)
DCL VAR(&LST_COUNT) TYPE(*DEC) LEN(5) VALUE(0)
DCL VAR(&EXC_COUNT) TYPE(*DEC) LEN(5) VALUE(0)
DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) VALUE('*')
DCL VAR(&NBRTORTN) TYPE(*CHAR) LEN(4)
DCL VAR(&KEYSTORTN) TYPE(*CHAR) LEN(8)
DCL VAR(&KEY1 ) TYPE(*CHAR) LEN(4)
DCL VAR(&KEY2 ) TYPE(*CHAR) LEN(4)
DCL VAR(&SBSSYS ) TYPE(*CHAR) LEN(20)
DCL VAR(&WRKSTS ) TYPE(*CHAR) LEN(4)
DCL VAR(&JOBWRKSTS) TYPE(*CHAR) LEN(4)
DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(256)
DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&MSGTXT) TYPE(*CHAR) LEN(256)
MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(ERROR))
/*- DIVISION OF COMMAND PARAMETER ----------------------------------*/
CHGVAR VAR(&SBSD) VALUE(%SST(&SBSDANDLIB 1 10))
CHGVAR VAR(&SBSDLIB) VALUE(%SST(&SBSDANDLIB 11 10))
IF (&SBSD *NE '*ALL') DO
CHKOBJ OBJ(&SBSDLIB/&SBSD) OBJTYPE(*SBSD)
MONMSG MSGID(CPF9801) EXEC(DO)
RCVMSG MSGQ(*PGMQ) RMV(*NO)
/* MSG: SBSD IN LIBRARY NOT FOUND */
SNDPGMMSG MSGID(CPF9801) MSGF(QCPFMSG) +
MSGDTA(&SBSDANDLIB) MSGTYPE(*ESCAPE)
ENDDO
RTVOBJD OBJ(&SBSDLIB/&SBSD) OBJTYPE(*SBSD) +
RTNLIB(&RTNSBSDLIB)
CHGVAR VAR(%SST(&SBSDANDLIB 11 10)) VALUE(&RTNSBSDLIB)
ENDDO
CHGVAR VAR(%BIN(&NBRTORTN)) VALUE(2)
/* 0101 -- Ststus as WRKACTJOB */
CHGVAR VAR(%BIN(&KEY1 )) VALUE(0101)
/* 1906 -- Subsystem */
CHGVAR VAR(%BIN(&KEY2 )) VALUE(1906)
CHGVAR VAR(&KEYSTORTN) VALUE(&KEY1 *CAT &KEY2)
CHGVAR VAR(&USP_NAME) VALUE('CHKJOBNAME')
CHGVAR VAR(&USP_LIB) VALUE('QTEMP')
CHGVAR VAR(&USP_QUAL) VALUE(&USP_NAME *CAT +
&USP_LIB)
CHGVAR VAR(&USP_TYPE) VALUE('MYTYPE')
CHGVAR VAR(%BIN(&USP_SIZE)) VALUE(128000)
CHGVAR VAR(&USP_FILL) VALUE(' ')
CHGVAR VAR(&USP_AUT) VALUE('*USE')
CHGVAR VAR(&USP_TEXT) VALUE('my user space')
DLTUSRSPC USRSPC(&USP_LIB/&USP_NAME)
MONMSG CPF0000
CALL PGM(QUSCRTUS) PARM(&USP_QUAL &USP_TYPE +
&USP_SIZE &USP_FILL &USP_AUT &USP_TEXT)
CHGVAR VAR(&API_USQUAL) VALUE(&USP_QUAL)
CHGVAR VAR(&API_JBNAM) VALUE(&MYJOBNAME)
/* CHGVAR VAR(&API_USER) VALUE('*ALL') */
CHGVAR VAR(&API_USER) VALUE(&JOBUSER)
CHGVAR VAR(&API_JOBNR) VALUE('*ALL')
CHGVAR VAR(&API_STATUS) VALUE('*ACTIVE')
CHGVAR VAR(&API_JBQUAL) VALUE(&API_JBNAM *CAT +
&API_USER *CAT &API_JOBNR)
CALL PGM(QUSLJOB) PARM(&API_USQUAL 'JOBL0200' +
&API_JBQUAL &API_STATUS X'00000000' +
&TYPE &NBRTORTN &KEYSTORTN)
CHGVAR VAR(%BIN(&STARTPOS)) VALUE(1)
CHGVAR VAR(%BIN(&DATALEN)) VALUE(140)
CALL PGM(QUSRTVUS) PARM(&API_USQUAL &STARTPOS +
&DATALEN &HEADER)
CHGVAR VAR(&LST_OFFSET) VALUE(%BIN(&HEADER 125 4))
CHGVAR VAR(&LST_SIZE) VALUE(%BIN(&HEADER 129 4))
CHGVAR VAR(&LST_NBR) VALUE(%BIN(&HEADER 133 4))
CHGVAR VAR(&LST_LEN) VALUE(%BIN(&HEADER 137 4))
CHGVAR VAR(%BIN(&LST_POSBIN)) VALUE(&LST_OFFSET + 1)
CHGVAR VAR(&LST_LENBIN) VALUE(%SST(&HEADER 137 4))
CHGVAR VAR(&LST_COUNT) VALUE(0)
CHGVAR VAR(&EXC_COUNT) VALUE(0)
IF (&LST_NBR *EQ 0) DO
IF (&JOBUSER *EQ '*ALL') DO
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Job' +
*BCAT &MYJOBNAME *BCAT 'was not found!') +
MSGTYPE(*ESCAPE)
ENDDO
ELSE DO
ENDDO
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('User' *BCAT &JOBUSER *BCAT +
'run job' *BCAT &MYJOBNAME *BCAT +
'was not found!') +
MSGTYPE(*ESCAPE)
ENDDO
LST_LOOP: IF COND(&LST_COUNT *EQ &LST_NBR) THEN(GOTO +
CMDLBL(LST_END))
CALL PGM(QUSRTVUS) PARM(&API_USQUAL &LST_POSBIN +
&LST_LENBIN &LST_DATA)
CHGVAR VAR(&JOBNAME) VALUE(%SST(&LST_DATA 1 10))
CHGVAR VAR(&USER) VALUE(%SST(&LST_DATA 11 10))
CHGVAR VAR(&JOBNBR) VALUE(%SST(&LST_DATA 21 6))
CHGVAR VAR(&STATUS) VALUE(%SST(&LST_DATA 43 10))
CHGVAR VAR(&JOBTYPE) VALUE(%SST(&LST_DATA 53 1))
CHGVAR VAR(&SUBTYPE) VALUE(%SST(&LST_DATA 54 1))
/* for status */
CHGVAR VAR(&WRKSTS ) VALUE(%SST(&LST_DATA 81 4))
/* for subsystem */
CHGVAR VAR(&SBSSYS ) VALUE(%SST(&LST_DATA 101 20))
IF COND(&MYJOBNAME *EQ '*ALL' *OR +
&JOBNAME *EQ &MYJOBNAME) THEN(DO)
IF ((&SBSD *EQ '*ALL') *OR +
(&SBSDANDLIB *EQ &SBSSYS)) DO
CHGVAR &JOBWRKSTS %SST(&JOBSTS 2 4)
IF ((&JOBSTS *EQ '*ALL') *OR +
(&JOBWRKSTS *EQ &WRKSTS)) DO
IF (&ACTION *NE '*CMD') DO
IF (&ACTION *EQ '*CHG') +
CHGVAR &CMDSTR 'CHGJOB'
IF (&ACTION *EQ '*END') +
CHGVAR &CMDSTR 'ENDJOB'
IF (&ACTION *EQ '*HLD') +
CHGVAR &CMDSTR 'HLDJOB'
IF (&ACTION *EQ '*RLS') +
CHGVAR &CMDSTR 'RLSJOB'
IF (&ACTION *EQ '*DSP') DO
CHGVAR &CMDSTR 'DSPJOB'
CHGVAR &JOBOPT 'OPTION(*ALL) OUTPUT(*PRINT)'
ENDDO
CHGVAR &CMDSTR (&CMDSTR *BCAT 'JOB(' *TCAT +
&JOBNBR *TCAT '/' *CAT +
&USER *TCAT '/' *CAT +
&JOBNAME *TCAT ')' *BCAT &JOBOPT)
ENDDO
ELSE DO
CHGVAR &CMDSTR &CMD
ENDDO
CHGVAR VAR(&EXC_COUNT) VALUE(&EXC_COUNT + 1)
IF (&ACTION *EQ '*MSG') DO
SNDPGMMSG MSG('Job' *BCAT +
&JOBNBR *TCAT '/' *CAT +
&USER *TCAT '/' *CAT +
&JOBNAME *BCAT 'status is' *BCAT +
&WRKSTS *TCAT '.') +
TOUSR(&TOUSR)
ENDDO
ELSE DO
CHGVAR VAR(&CMDLEN) VALUE(3000)
CALL PGM(QCMDEXC) PARM(&CMDSTR &CMDLEN)
MONMSG MSGID(CPF1346 CPF1349)
IF (&ACTION *EQ '*DSP') DO
CHGVAR &CMDSTR ('DSPJOB' *BCAT 'JOB(' *TCAT +
&JOBNBR *TCAT '/' *CAT +
&USER *TCAT '/' *CAT +
&JOBNAME *TCAT ')' *BCAT +
'OPTION(*JOBLOG) OUTPUT(*PRINT)')
CHGVAR VAR(&CMDLEN) VALUE(3000)
CALL PGM(QCMDEXC) PARM(&CMDSTR &CMDLEN)
MONMSG MSGID(CPF1346 CPF1349)
ENDDO
ENDDO
ENDDO /* ENDDO JOBSTS */
ENDDO /* ENDDO SBSD */
ENDDO /* ENDDO JOBNAME */
CHGVAR VAR(&LST_COUNT) VALUE(&LST_COUNT + 1)
CHGVAR VAR(%BIN(&LST_POSBIN)) +
VALUE(%BIN(&LST_POSBIN) + &LST_LEN)
GOTO CMDLBL(LST_LOOP)
LST_END:
IF (&EXC_COUNT *EQ 0) DO
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
MSGDTA('User' *BCAT &JOBUSER *BCAT +
'run job' *BCAT &MYJOBNAME *BCAT +
'under subsystem' *BCAT +
&RTNSBSDLIB *TCAT '/' *CAT &SBSD *BCAT +
'was not found!') +
MSGTYPE(*ESCAPE)
ENDDO
DLTUSRSPC USRSPC(&USP_LIB/&USP_NAME)
Return
/* =============================================================== */
/* = Error routine = */
/* =============================================================== */
Error:
RcvMsg MsgType( *Excp ) +
MsgDta( &MsgDta ) +
MsgID( &MsgID ) +
MsgF( &MsgF ) +
MsgFLib( &MsgFLib )
MonMsg ( CPF0000 MCH0000 )
SndMsg:
SndPgmMsg MsgID( &MsgID ) +
MsgF( &MsgFLib/&MsgF ) +
MsgDta( &MsgDta ) +
MsgType( *Escape )
MonMsg ( CPF0000 MCH0000 )
/* =============================================================== */
/* = End of program = */
/* =============================================================== */
ENDPGM
File : QCMDSRC
Member: CHKACTJOB
Type : CMD
Usage : CRTCMD CMD(lib/CHKACTJOB) PGM(lib/CHKACTJOB)
/* =============================================================== */
/* = Command....... ChkJob = */
/* = CPP........... ChkJob = */
/* = Description... Check Job by job name and subsystem = */
/* = = */
/* = CrtCmd Cmd( ChkJob ) = */
/* = Pgm( ChkJob ) = */
/* = SrcFile( YourSourceFile ) = */
/* =============================================================== */
/* = Date : 2007/06/04 = */
/* = Author: Vengoal Chang = */
/* =============================================================== */
/* = Date : 2007/06/21 = */
/* = Author: Vengoal Chang = */
/* = Added on ACTION *MSG to send status message to user= */
/* =============================================================== */
/* = Date : 2007/08/08 = */
/* = Author: Vengoal Chang = */
/* = Added on JOBSTS keyword to limit job processing = */
/* =============================================================== */
/* = Date : 2007/08/14 = */
/* = Author: Vengoal Chang = */
/* = Added on ACTION *DSP to display job information = */
/* = DSPJOB OPTION(*ALL) OUTPUT(*PRINT) = */
/* = DSPJOB OPTION(*JOBLOG) OUTPUT(*PTINT) = */
/* =============================================================== */
CMD PROMPT('Check Job')
PARM KWD(JOBNAME) TYPE(*NAME) SPCVAL((*ALL)) +
MIN(1) PROMPT('Job name')
PARM KWD(JOBUSER) TYPE(*NAME) SPCVAL((*ALL)) +
MIN(1) PROMPT('Job user')
PARM KWD(SBS) TYPE(SBSD) MIN(1) PROMPT('Job +
running under subsystem')
PARM KWD(JOBSTS) TYPE(*CHAR) LEN(5) RSTD(*YES) +
DFT(*ALL) VALUES(*ALL *MSGW) PROMPT('Job +
selection by ACTJOB status')
PARM KWD(ACTION) TYPE(*CHAR) LEN(5) RSTD(*YES) +
DFT(*MSG) VALUES(*DSP *CHG *END *HLD *RLS +
*MSG *CMD) EXPR(*YES) PROMPT('Action')
PARM KWD(JOBOPT) TYPE(*CHAR) LEN(3000) +
PMTCTL(IFPGM) PROMPT('Job command option +
DSP,CHG,END')
PARM KWD(TOUSR) TYPE(*NAME) LEN(10) +
SPCVAL((*SYSOPR)) PMTCTL(IFTOUSR) +
PROMPT('Send status message to user')
PARM KWD(CMD) TYPE(*CMDSTR) LEN(3000) +
PMTCTL(IFCMD) PROMPT('Command to run')
SBSD: QUAL TYPE(*NAME) LEN(10) SPCVAL((*ALL)) EXPR(*YES)
QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
SPCVAL((*LIBL) (*CURLIB)) EXPR(*YES) +
PROMPT('Library')
IFPGM: PMTCTL CTL(ACTION) COND((*EQ *CHG))
PMTCTL CTL(ACTION) COND((*EQ *END)) LGLREL(*OR)
IFTOUSR: PMTCTL CTL(ACTION) COND((*EQ *MSG))
IFCMD: PMTCTL CTL(ACTION) COND((*EQ *CMD))
DEP CTL(&ACTION *EQ *CHG) PARM((JOBOPT))
DEP CTL(&ACTION *EQ *END) PARM((JOBOPT))
DEP CTL(&ACTION *EQ *MSG) PARM((TOUSR))
DEP CTL(&ACTION *EQ *CMD) PARM((CMD))
File : QCLSRC
Member: CHKACTJOBT
Type : CLP
Usage : CRTCLPGM PGM(lib/CHKACTJOBT)
CALL CHKACTJOBT
PGM
DCL &MSGTXT *CHAR 256
CHKACTJOB JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QINTER) +
ACTION(*CHG) JOBOPT('RUNPTY(10)')
MONMSG CPF9898 EXEC(DO)
RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT)
DMPCLPGM
ENDDO
CHKACTJOB JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) +
ACTION(*MSG) TOUSR(*SYSOPR)
MONMSG CPF9898 EXEC(DO)
RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT)
DMPCLPGM
ENDDO
CHKACTJOB JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) +
JOBSTS(*MSGW) ACTION(*MSG) TOUSR(*SYSOPR)
MONMSG CPF9898 EXEC(DO)
RCVMSG MSGTYPE(*EXCP) MSG(&MSGTXT)
DMPCLPGM
ENDDO
CHKACTJOB JOBNAME(QSYSSCD) JOBUSER(QPGMR) SBS(QCTL) +
JOBSTS(*MSGW) ACTION(*MSG) TOUSR(*SYSOPR)
MONMSG CPF9898
ENDPGM
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期三, 11月 08, 2023
2007-08-14 要如何檢核某個 Job 的狀態並採取某些相對應動作 ? (Command: CHKACTJOB)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言