如何確認某個 Job 已在系統中執行?(CMD: RTVJOBSTS)
*如何確認某個 Job 已在系統中執行?(CMD: RTVJOBSTS)*
有時候我們會 submit 某些固定 Jobname 的 Job 至批次環境(背景)執行,但我們有
時又需限制同一個 Job name 的 job,在同一時間只能執行一次時該者麼辦?那就需要
於執行該 Job 前檢查系統此 Job 是否正在執行?
又或許於某些時候需要檢查某個 Job 是否正在執行(Active)?
上述二個情形都需要知道所指定的 Jobname 的 Job 於系統中的狀態,所以我寫一個指令 RTVJOBSTS 來簡化整個程序。
此指令依照所指定的 Jobname 來檢查系統中是否有相同 Jobname 的 Job,且會回傳
'0' : 沒有所指定的 Jobname 於系統中執行
'1' : 表示含有一或多個 Job 正在執行中
' ' : 命令執行錯誤
*
File : QCLSRC
Member: RTVJOBSTSC
Type : CLP
Usage : CRTCLPGM your-lib/RTVJOBSTSC
*
/****************************************************************/
/* */
/* PURPOSE.. CPP For Retrieve Job Status (RTVJOBSTS) Command */
/* */
/* PARMS.... &JOBNAME Input CHAR(10) */
/* &RETURNCODE Output CHAR(1) */
/* */
/* '0' -> No jobs active with name */
/* specified. */
/* */
/* '1' -> One or more jobs active with */
/* name specified. */
/* */
/* ' ' -> Error/undefined. */
/* */
/****************************************************************/
RTVJOBSTSC: PGM PARM(&JOBNAME &RETURNCODE)
DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10)
DCL VAR(&RETURNCODE) TYPE(*CHAR) LEN(1)
DCL VAR(&QUALJOB) TYPE(*CHAR) LEN(26) /* +
Qualified job name */
DCL VAR(&QUALUSRSPC) TYPE(*CHAR) LEN(20) +
VALUE('RTVJOBSTS QTEMP') /* Qualified +
user space name */
DCL VAR(&USRSPC) TYPE(*CHAR) LEN(10) +
VALUE('RTVJOBSTS') /* User space name */
DCL VAR(&ATR) TYPE(*CHAR) LEN(10) VALUE('TEMP') +
/* Extended attribute for user space */
DCL VAR(&SIZE) TYPE(*CHAR) LEN(4) +
VALUE(X'00000400') /* Initial size of +
user space. (1024 in decimal) */
DCL VAR(&INLVAL) TYPE(*CHAR) LEN(1) VALUE(' ') +
/* Initial value for user space */
DCL VAR(&AUT) TYPE(*CHAR) LEN(10) VALUE('*ALL') +
/* Public authority for user space */
DCL VAR(&TEXT) TYPE(*CHAR) LEN(50) +
VALUE('Created by RTVJOBSTS command') /* +
Text for user space */
DCL VAR(&COUNT) TYPE(*CHAR) LEN(4) /* Active +
jobs found that match the name specified */
DCL VAR(&HEXZERO) TYPE(*CHAR) LEN(4) +
VALUE(X'00000000') /* Literal value of +
hex zero */
/****************************************************************/
/* Global Message Monitor Declares */
/****************************************************************/
DCL VAR(#MSGFLIB) TYPE(*CHAR) LEN(10) /* +
Message File Library */
DCL VAR(#MSGF) TYPE(*CHAR) LEN(10) /* Message +
File */
DCL VAR(#MSGID) TYPE(*CHAR) LEN(7) /* Message +
ID */
DCL VAR(#MSGDTA) TYPE(*CHAR) LEN(128) /* +
Message data */
/****************************************************************/
/* Global Message Monitor */
/****************************************************************/
MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO +
CMDLBL(##ERROR))
GOTO CMDLBL(##NOERROR)
##ERROR: RCVMSG MSGTYPE(*EXCP) MSGDTA(#MSGDTA) +
MSGID(#MSGID) MSGF(#MSGF) +
MSGFLIB(#MSGFLIB)
MONMSG MSGID(CPF0000 MCH0000) /* Just in case */
SNDPGMMSG MSGID(#MSGID) MSGF(#MSGFLIB/#MSGF) +
MSGDTA(#MSGDTA) TOPGMQ(*PRV) +
MSGTYPE(*ESCAPE)
MONMSG MSGID(CPF0000 MCH0000) /* Just in case */
RETURN
##NOERROR:
/****************************************************************/
/* Initialize Return Code */
/****************************************************************/
CHGVAR VAR(&RETURNCODE) VALUE(' ')
/****************************************************************/
/* Create User Space If Necessary */
/****************************************************************/
CHKOBJ OBJ(QTEMP/&USRSPC) OBJTYPE(*USRSPC)
MONMSG MSGID(CPF9801) EXEC(DO) /* Not found */
CALL PGM(QUSCRTUS) PARM(&QUALUSRSPC &ATR &SIZE +
&INLVAL &AUT &TEXT)
ENDDO
/****************************************************************/
/* List Active Jobs That Match The Name Specified */
/****************************************************************/
CHGVAR VAR(&QUALJOB) VALUE(&JOBNAME)
CHGVAR VAR(%SST(&QUALJOB 11 10)) VALUE('*ALL')
CHGVAR VAR(%SST(&QUALJOB 21 6)) VALUE('*ALL')
CALL PGM(QUSLJOB) PARM(&QUALUSRSPC 'JOBL0100' +
&QUALJOB '*ACTIVE ')
/****************************************************************/
/* Chect List For Number Of Active Jobs */
/* */
/* Use the following command to determine the number of */
/* active jobs found that match the name specified. If 0, */
/* no job is active by that name. Variable &COUNT is set */
/* to the number of jobs, in binary. If &COUNT = X'00000000' */
/* the job is not active. */
/****************************************************************/
CALL PGM(QUSRTVUS) PARM(&QUALUSRSPC X'00000085' +
X'00000004' &COUNT)
IF COND(&COUNT *EQ &HEXZERO) THEN(CHGVAR +
VAR(&RETURNCODE) VALUE('0'))
ELSE CMD(CHGVAR VAR(&RETURNCODE) VALUE('1'))
RETURN
ENDPGM
*
File : QCMDSRC
Member: RTVJOBSTS
Type : CMD
Usage : CRTCMD CMD(your-lib/RTVJOBSTS) PGM(your-lib/RTVJOBSTSC) ALLOW(*IPGM *BPGM)
由於此命令會回傳值,所以限制於程式中呼叫使用,無法直接用於命令列。
*
/* Retreive job status command; CPP is RTVJOBSTS */
CMD PROMPT('Retrieve Job Status')
PARM KWD(JOB) TYPE(*NAME) MIN(1) PROMPT('Job name')
PARM KWD(STATUS) TYPE(*CHAR) LEN(1) RTNVAL(*YES) +
MIN(1) PROMPT('CL var for STATUS (1)')
*
File : QCLSRC
Member: TSTRTVJOBS
Type : CLP
Usage : CRTCLPGM TSTRTVJOBS
CALL TSTRTVJOBS
此程式為測試程式,他會將回傳值顯示於 畫面第 24 行。
*
PGM
DCL &JOBNAME *CHAR 10
DCL &RC *CHAR 1
RTVJOBA JOB(&JOBNAME)
RTVJOBSTS JOB(&JOBNAME) STATUS(&RC)
SNDPGMMSG MSG(&RC)
ENDPGM
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期一, 11月 06, 2023
2003-09-08 如何確認某個 Job 已在系統中執行?(CMD: RTVJOBSTS)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言