星期一, 11月 06, 2023

2003-09-08 如何確認某個 Job 已在系統中執行?(CMD: RTVJOBSTS)


如何確認某個 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           



沒有留言: