最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.10.02

6.13.ジョブチェッカ

[ Previous ] [ HOME ] [ Upper ] [ Next ]


ある時、気づくと、あるバッチプログラムがMSGWになっています。ああ誰かずっと監視していてくれないかな。はい、これです。これは、Never end programで、一度SBMJOBすると、ジョブキャンセルするまで、動きつづけます

ジョブチェッカーのダウンロード

/* JOB CHECKER                                                       */
/*                                                                   */
/*  1.CHECKED JOBS ARE BATCH TYPE OR INTERACTIVE TYPE ONLY.          */
/*  2.THIS PROGRAM DOES NOT TERMINATE.THEN THIS PROGRAM SHOULD BE    */
/*    ACTIVE IN BATCH ENVIRONMENT ONLY.                              */
/*  3.IF YOU WANT TO TERMINATE THIS PROGRAM,CANCEL IT BY "ENDJOB".   */
/*  4.YOU SHOULD CREATE THIS PROGRAM WITH LOG(*NO) IN CRTCLPGM.      */
/*                                                                   */
/*   BY T.KAKEFUDA    92.06.09                                       */
/*                                                                   */

 PGM  (&STATUS &PRINT &MESSAGE &TOUSR)

  DCL &STATUS       *CHAR    14  /* PARM. CHECKED JOB-STATUS */
  DCL &STS1         *CHAR     4
  DCL &STS2         *CHAR     4
  DCL &STS3         *CHAR     4
  DCL &PRINT        *CHAR     4  /* PARM. DO DSPJOB OUTFILE(*PRINT)? */
  DCL &MESSAGE      *CHAR     4  /* PARM. SEND INFORMATION ? */
  DCL &TOUSR        *CHAR    32  /* PARM. TO WHOM SEND MESSAGE ? */
  DCL &TOUSR1       *CHAR    10
  DCL &TOUSR2       *CHAR    10
  DCL &TOUSR3       *CHAR    10

  DCL &USR_SPACE    *CHAR    20  'JOBLIST   QTEMP     '
  DCL &JOB_JOB      *CHAR    26  '*ALL      *ALL      *ALL  '
  DCL &JOB_STS      *CHAR    10  '*ACTIVE'
  DCL &JOB_JOBI     *CHAR    26  '*INT                      '
  DCL &JOB_INFO     *CHAR    52
  DCL &JOB_NAME     *CHAR    10
  DCL &JOB_USER     *CHAR    10
  DCL &JOB_JOBNO    *CHAR     6
  DCL &JOB_FULL     *CHAR    28
  DCL &JOB_INT#     *CHAR    16
  DCL &JOB_TYPE     *CHAR     1
  DCL &JOB_STATUS   *CHAR     4
  DCL &RTV_DATA     *CHAR    16
  DCL &RCV_DATA     *CHAR   111
  DCL &MSG          *CHAR   250

/* FOR DECIMAL */
  DCL &RTV_START    *DEC     (9 0)
  DCL &RTV_LNGTH    *DEC     (9 0)
  DCL &LST_OFFSET   *DEC     (9 0)
  DCL &LST_COUNT    *DEC     (9 0)
  DCL &LST_SIZE     *DEC     (9 0)
  DCL &WRK_COUNT    *DEC     (5 0)  /* COUNTER */

/* FOR BINARY */

  DCL &RTV_STARTB   *CHAR     4
  DCL &RTV_LNGTHB   *CHAR     4
  DCL &LST_OFSETB   *CHAR     4
  DCL &LST_COUNTB   *CHAR     4
  DCL &LST_SIZEB    *CHAR     4

  MONMSG CPF0000 *N GOTO RETURN

/*--------------------------------------*/
/*         INITIALIZE ROUTINE           */
/*--------------------------------------*/

/* &STATUS IS RESOLVED INTO 3 WORK FIELDS */

          CHGVAR &STS1      %SST(&STATUS   3  4)
          CHGVAR &STS2      %SST(&STATUS   7  4)
          CHGVAR &STS3      %SST(&STATUS  11  4)

 IF (&MESSAGE ='*YES') DO
          CHGVAR &TOUSR1    %SST(&TOUSR    3 10)
          CHGVAR &TOUSR2    %SST(&TOUSR   13 10)
          CHGVAR &TOUSR3    %SST(&TOUSR   23 10)
      IF (&TOUSR1='*REQUESTER')  RTVUSRPRF MSGQ(&TOUSR1)
      IF (&TOUSR2='*REQUESTER')  RTVUSRPRF MSGQ(&TOUSR2)
      IF (&TOUSR3='*REQUESTER')  RTVUSRPRF MSGQ(&TOUSR3)
      IF (&TOUSR1 *NE ' ') CHKOBJ  &TOUSR1  *MSGQ
      IF (&TOUSR2 *NE ' ') CHKOBJ  &TOUSR2  *MSGQ
      IF (&TOUSR3 *NE ' ') CHKOBJ  &TOUSR3  *MSGQ
                  ENDDO

/*--------------------------------------*/
/*         MAIN       ROUTINE           */
/*--------------------------------------*/

/* CREATE USER SPACE */

     CHKOBJ %SST(&USR_SPACE 11 10)/%SST(&USR_SPACE 1 10) *USRSPC
            MONMSG CPF9801 *N CALL QUSCRTUS +
     (&USR_SPACE 'WRK       ' X'00001000' ' ' '*ALL' 'WORK USER SPACE')

/* SET A JOB LIST INTO THE USER SPACE */

  RETRY:

      CHGVAR &WRK_COUNT  0
      CALL QUSLJOB (&USR_SPACE 'JOBL0100' &JOB_JOB &JOB_STS)

/* RETRIEVE HEADER INFORMATION OF THE JOB LIST FROM THE USER SPACE */

      CHGVAR %BIN(&RTV_STARTB) 125
      CHGVAR %BIN(&RTV_LNGTHB) 16

      CALL  QUSRTVUS (&USR_SPACE &RTV_STARTB &RTV_LNGTHB &RTV_DATA)

      CHGVAR &LST_COUNTB %SST(&RTV_DATA  9   4)
      CHGVAR &LST_COUNT  %BIN(&LST_COUNTB)

      IF (&LST_COUNT = 0 ) GOTO NEXT          /* NO DATA IN THE LIST */

      CHGVAR &LST_OFSETB %SST(&RTV_DATA 1  4)
      CHGVAR &LST_OFFSET %BIN(&LST_OFSETB)
      CHGVAR &LST_SIZEB  %SST(&RTV_DATA 13 4)
      CHGVAR &LST_SIZE   %BIN(&LST_SIZEB)

      CHGVAR &RTV_START        (&LST_OFFSET + 1)
      CHGVAR %BIN(&RTV_STARTB)  &RTV_START
      CHGVAR &RTV_LNGTH         &LST_SIZE
      CHGVAR %BIN(&RTV_LNGTHB)  &RTV_LNGTH

/* RETRIEVE LIST DATA FROM THE USER SPACE */

 RTV_JOB:CHGVAR &WRK_COUNT  (&WRK_COUNT + 1)          /* COUNT UP */

     CALL QUSRTVUS (&USR_SPACE &RTV_STARTB &RTV_LNGTHB &JOB_INFO)

/* GET THE JOB INFORMATION BY RETRIEVED DATA. */

      CHGVAR   &JOB_INT#   %SST(&JOB_INFO  27  16)

   CALL QUSRJOBI (&RCV_DATA X'0000006F' 'JOBI0200' &JOB_JOBI &JOB_INT#)
         MONMSG CPF0000 *N GOTO SKIP

      CHGVAR &JOB_TYPE   %SST(&RCV_DATA   61   1)
      CHGVAR &JOB_STATUS %SST(&RCV_DATA  108   4)

/* IF IT IS BATCH JOB OR IT IS INTERACTIVE JOB,CHECK STATUS OF IT.*/

IF (&JOB_TYPE='B' | &JOB_TYPE='I') DO

 IF (&JOB_STATUS=&STS1 | &JOB_STATUS=&STS2 | &JOB_STATUS=&STS3) DO

          CHGVAR &JOB_NAME  %SST(&RCV_DATA    9  10)
          CHGVAR &JOB_USER  %SST(&RCV_DATA   19  10)
          CHGVAR &JOB_JOBNO %SST(&RCV_DATA   29   6)

  IF (&JOB_NAME='QSYSMSG_CK') GOTO SKIP   /*例外*/

  IF (&PRINT  ='*YES') DSPJOB &JOB_JOBNO/&JOB_USER/&JOB_NAME *PRINT

  IF (&MESSAGE='*YES') DO
   CHGVAR &JOB_FULL (&JOB_NAME|<'/'|<&JOB_USER|<'/'|< &JOB_JOBNO)
   CHGVAR &MSG +
         ('ジョブ'|<&JOB_FULL|<'が'|<&JOB_STATUS|<'です! ')
     IF (&TOUSR1 *NE ' ') SNDPGMMSG  MSG(&MSG) TOUSR(&TOUSR1)
     IF (&TOUSR2 *NE ' ') SNDPGMMSG  MSG(&MSG) TOUSR(&TOUSR2)
     IF (&TOUSR3 *NE ' ') SNDPGMMSG  MSG(&MSG) TOUSR(&TOUSR3)
   ENDDO

  ENDDO
 ENDDO

 SKIP:   IF (&LST_COUNT = &WRK_COUNT) GOTO NEXT

      CHGVAR &RTV_START        (&RTV_START + &LST_SIZE)
      CHGVAR %BIN(&RTV_STARTB)  &RTV_START

      GOTO RTV_JOB

/* RETRY AFTER 10 MINUTES */

NEXT:
             DLYJOB  DLY(600)
             GOTO RETRY

RETURN:      RETURN
ENDPGM

    

             CMD        PROMPT('JOB STATUS CHECK')
             PARM       KWD(STATUS) TYPE(STSLIST) PROMPT('JOB STATUS')
             PARM       KWD(PRINT) TYPE(*CHAR) LEN(4) RSTD(*YES) +
                          DFT(*YES) VALUES(*YES *NO) PROMPT('PRINT +
                          JOBLOG')
             PARM       KWD(MSG) TYPE(*CHAR) LEN(4) RSTD(*YES) +
                          DFT(*NO) VALUES(*YES *NO) PROMPT('SEND +
                          MESSAGE')
             PARM       KWD(TOUSR) TYPE(USRLIST) PROMPT('USER NAME')
             DEP        CTL(MSG *EQ *YES) PARM((TOUSR))
 STSLIST:    ELEM       TYPE(*CHAR) LEN(4) RSTD(*YES) DFT(*MSGW) +
                          SPCVAL((*MSGW MSGW) (*LCKW LCKW) (*SRQ +
                          SRQ) (*NONE NONE))
             ELEM       TYPE(*CHAR) LEN(4) RSTD(*YES) DFT(*LCKW) +
                          SPCVAL((*MSGW MSGW) (*LCKW LCKW) (*SRQ +
                          SRQ) (*NONE NONE))
             ELEM       TYPE(*CHAR) LEN(4) RSTD(*YES) DFT(*SRQ) +
                          SPCVAL((*MSGW MSGW) (*LCKW LCKW) (*SRQ +
                          SRQ) (*NONE NONE))
 USRLIST:    ELEM       TYPE(*NAME) LEN(10)
             ELEM       TYPE(*NAME) LEN(10)
             ELEM       TYPE(*NAME) LEN(10) 
             
             

[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送