Tools

15. JOB が活動中であるかどうか調べる CHKJOB

ありそうでないのが CHKJOB というコマンド。
CHKJOB コマンドは、指定した JOB 現在活動中であるかを検査する。
ジョブが活動中でないときは CPF9897 が *ESCAPE メッセージとして戻るので
例えば ユーザー CLP の中で

CHKJOB JOB(MYJOB)
 MONMSG   CPF9800  DO
       SNDPGMMSG MSG('JOB IS NOT ACTIVE')
 ENDDO

のようにして検査することができる。

【 CHKJOB : CMD 】
CMD        PROMPT(' ジョブの活動検査 ')          
PARM       KWD(JOB) TYPE(*NAME) LEN(10) MIN(1) + 
             PROMPT(' ジョブ名 ')
【 CHKJOBCL : CLP 】
             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