星期四, 11月 09, 2023

2018-12-03 Check Daily Batch Jobs started or not


Check Daily Batch Jobs started or not

CHKBCHJOB CLP read file CHKBCHJOBP and check current time >=  start time and current time < end time and chkflg ='Y',
then call API get the job active information, If job does not active, then send the job not acticve message to sysopr.
If job active, but status is MSGW, also send message to sysopr.


File  : QDDSSRC
Member: CHKBCHJOBP
Type  : PF
Usage : CrtPF File(CHKBCHJOBP)        
        




     A*****************************************************************
     A*   FUNCTION    : CHKBCHJOB monitor batch job file
     A*   FILE        : CHKBCHJOBP
     A*   AUTHOR      : Vengoal Chang
     A*   DATE        : 2018/12/03
     A*****************************************************************
     A                                      UNIQUE
     A          R BCHJOBR                   TEXT('Batch job record')
     A            JOBNAME       10A         COLHDG(' JOB NAME')
     A            JOBUSER       10A         COLHDG(' USER')
     A            STRTIME        6S 0       COLHDG('start time')
     A            ENDTIME        6S 0       COLHDG('end time')
     A            CHKFLAG        1A         COLHDG('check Y/N')
     A            NOTE          32O         COLHDG('note')
     A            UPDDATE        8S 0       COLHDG('update date')
     A            UPDTIME        6S 0       COLHDG('update time')
     A*----------------------------------------------------------------
     A          K JOBNAME





File  : QCLSRC
Member: CHKBCHJOBC
Type  : CLP
OS400 : V5R4 above
Usage : CrtClPgm Pgm(ChkBCHJOBC)
        
        




/*  ===============================================================  */
/*  = Program ChkBchJobC                                          =  */
/*  =   ChkBchJob  CLP                                            =  */
/*  =   Paramater notes:                                          =  */
/*  =     Read CHKBCHJOBP file to check daily job active or not   =  */
/*  ===============================================================  */
/*  = Date  : 2018/12/03                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */

PGM

     DCL         &CURTIMEC    *CHAR  6
     DCL         &STRTIMEC    *CHAR  6
     DCL         &ENDTIMEC    *CHAR  6
     DCL         &CURTIME     *DEC  (6 0)
     DCL         &MSGTEXT     *CHAR 256

     DCL         &USP_NAME    *CHAR  10
     DCL         &USP_LIB     *CHAR  10
     DCL         &USP_QUAL    *CHAR  20
     DCL         &USP_TYPE    *CHAR  10
     DCL         &USP_SIZE    *CHAR  4
     DCL         &USP_FILL    *CHAR  1
     DCL         &USP_AUT     *CHAR  10
     DCL         &USP_TEXT    *CHAR  50

     DCL         &API_USQUAL  *CHAR  20
     DCL         &API_JBQUAL  *CHAR  26
     DCL         &API_JBNAM   *CHAR  10
     DCL         &API_USER    *CHAR  10
     DCL         &API_JOBNR   *CHAR  6
     DCL         &API_STATUS  *CHAR  10

     DCL         &STARTPOS    *CHAR  4
     DCL         &DATALEN     *CHAR  4
     DCL         &HEADER      *CHAR  150
     DCL         &LST_OFFSET  *DEC  (10 0)
     DCL         &LST_SIZE    *DEC  (10 0)
     DCL         &LST_DATA    *CHAR  4096
     DCL         &LST_NBR     *DEC  (5 0)
     DCL         &LST_LEN     *DEC  (5 0)
     DCL         &LST_LENBIN  *CHAR  4
     DCL         &LST_POSBIN  *CHAR  4
     DCL         &LST_COUNT   *DEC  (5 0) VALUE(0)
     DCL         &EXC_COUNT   *DEC  (5 0) VALUE(0)
     DCL         &TYPE        *CHAR  1    VALUE('*')
     DCL         &NBRTORTN    *CHAR  4
     DCL         &KEYSTORTN   *CHAR  16
     DCL         &KEY1        *CHAR  4
     DCL         &KEY2        *CHAR  4
     DCL         &KEY3        *CHAR  4
     DCL         &KEY4        *CHAR  4
     DCL         &SBSSYS      *CHAR  20
     DCL         &WRKSTS      *CHAR  4
     DCL         &MSGRPLY     *CHAR  1
     DCL         &USER        *CHAR  10
     DCL         &CURUSR      *CHAR  10
     DCL         &JOBNBR      *CHAR  6
     DCL         &STATUS      *CHAR  10
     DCL         &JOBTYPE     *CHAR  1
     DCL         &SUBTYPE     *CHAR  1

     DCLF        CHKBCHJOBP

     MONMSG      (CPF0000 MCH0000) *NONE   GOTO ERROR

 READF:
     RCVF
     MONMSG      CPF0864 *N GOTO ENDF

     RTVSYSVAL   SYSVAL(QTIME) RTNVAR(&CURTIMEC)
     CHGVAR      &CURTIME      &CURTIMEC
     IF         (&CURTIME >= &STRTIME *AND                      +
                 &CURTIME <  &ENDTIME *AND                      +
                 &CHKFLAG =  'Y')     Do

       CallSubR   SubR(ListJob)
       If         (&LST_NBR *EQ 0)    Do
       CHGVAR     &STRTIMEC     &STRTIME
       CHGVAR     &ENDTIMEC     &ENDTIME
       CHGVAR     &MSGTEXT      +
                 ('* Bctch Job=' *CAT                        +
                  &JOBNAME  *CAT  'run time : '  *CAT          +
                  &STRTIMEC *BCAT '~' *BCAT &ENDTIMEC *CAT      +
                  ', program not started !')
       SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG)                  +
                  MSGDTA(&MSGTEXT) TOMSGQ(*SYSOPR)
       EndDo

     EndDo

     Goto        READF

 ENDF:
     Return

 Error:
     Call        QMHMOVPM    ( '    '                           +
                               '*DIAG'                          +
                               x'00000001'                      +
                               '*PGMBDY'                        +
                               x'00000001'                      +
                               x'0000000800000000'              +
                             )

     Call        QMHRSNEM    ( '    '                           +
                               x'0000000800000000'              +
                             )

    /****************************************************************/
    /* Sub routine ListJob                                          */
    /****************************************************************/
     SUBR        SUBR(ListJob)
             CHGVAR     VAR(%BIN(&NBRTORTN)) VALUE(4)
     /* 0101 -- Ststus as WRKACTJOB */
             CHGVAR     VAR(%BIN(&KEY1     )) VALUE(0101)
     /* 1906 -- Subsystem */
             CHGVAR     VAR(%BIN(&KEY2     )) VALUE(1906)
     /* 1307 -- Message Reply */
             CHGVAR     VAR(%BIN(&KEY3     )) VALUE(1307)
     /* 0305 -- Current user profile */
             CHGVAR     VAR(%BIN(&KEY4     )) VALUE(0305)
             CHGVAR     VAR(&KEYSTORTN) VALUE(&KEY1 *CAT &KEY2 *CAT +
                                              &KEY3 *CAT &KEY4)

             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(&JOBNAME)
             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)

             IF (&LST_NBR *EQ 0) DO
             /* Job not found   */
             Goto       Lst_End
             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))
      /* for msgrply   */
             CHGVAR     VAR(&MSGRPLY) VALUE(%SST(&LST_DATA 137  1))
      /* for current user */
             CHGVAR     VAR(&CURUSR ) VALUE(%SST(&LST_DATA 157  10))

             IF   (&WRKSTS *EQ 'MSGW' *AND &MSGRPLY *EQ '1')  DO
               CHGVAR &MSGTEXT ('* Job' *BCAT +
                                &JOBNBR *TCAT '/' *CAT +
                                &USER   *TCAT '/' *CAT +
                                &JOBNAME *BCAT 'status is' *BCAT +
                                &WRKSTS *TCAT '.')
               SNDPGMMSG        MSGID(CPF9898) MSGF(QCPFMSG)       +
                                MSGDTA(&MSGTEXT) TOMSGQ(*SYSOPR)
             EndDo

             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:
             DLTUSRSPC  USRSPC(&USP_LIB/&USP_NAME)
     ENDSUBR

 EndPgm:
     EndPgm





						
File  : QCLSRC
Member: CHKBCHJOB
Type  : CLP 
Usage : CRTCLPGM CHKBCHJOB
        Insert your batch job which need to be monitored to CHKBCHJOBP 
        SBMJOB CMD(CALL CHKBCHJOB) JOB(CHKBCHJOB)

PGM


/*-- Global error monitoring:  --------------------------------------*/
     MonMsg     CPF0000      *N        GoTo Error

 Loop:                    
     Call       ChkBchJobC
     DlyJob     300       
     Goto       Loop      

 Return:
     
     Return

/*-- Error handling:  -----------------------------------------------*/
 Error:

     Call      QMHMOVPM    ( '    '                                  +
                             '*DIAG'                                 +
                             x'00000001'                             +
                             '*PGMBDY'                               +
                             x'00000001'                             +
                             x'0000000800000000'                     +
                           )

     Call      QMHRSNEM    ( '    '                                  +
                             x'0000000800000000'                     +
                           )

 EndPgm:
     EndPgm







沒有留言: