ジョブのより詳細な情報の取得 (V5R4)

WATCH などいろんな機能が充実してきて、いろんな監視ツールが作れるようになってきています。

そういったツールで監視などを行っていると、さらによりきめの細かな、たとえばジョブの実行ユーザーや稼動しているサブシステムなどによって、監視対象にしたりしなかったりしたい、といったニーズが得てして出てきます。
ジョブのより詳細な情報・属性を元に監視メッセージを出したり、処置をしたりしたい、というわけですね。


パッと思いつくのは RTVJOBA コマンドですが、これは自分のジョブの属性しかわかりません。
WATCH 機能で捕捉したジョブには使えません。

そんな時に使いやすいのが System API の QUSRJOBI です。

↓のように CL からも簡単に呼び出すことができます。

             PGM        PARM(&NAME &USER &NBR)                                  
                                                                                
             DCL        VAR(&JOB_INF) TYPE(*CHAR) LEN(1024)                     
             DCL        VAR(&SBSNAME) TYPE(*CHAR) STG(*DEFINED) +               
                          LEN(10) DEFVAR(&JOB_INF 72)                           
             DCL        VAR(&CURUSER) TYPE(*CHAR) STG(*DEFINED) +               
                          LEN(10) DEFVAR(&JOB_INF 92)                           
             DCL        VAR(&RCVLEN) TYPE(*INT) VALUE(1024)                     
                                                                                
             DCL        VAR(&JOB) TYPE(*CHAR) LEN(26)                           
             DCL        VAR(&NAME) TYPE(*CHAR) STG(*DEFINED) LEN(10) +          
                          DEFVAR(&JOB 1)                                        
             DCL        VAR(&USER) TYPE(*CHAR) STG(*DEFINED) LEN(10) +          
                          DEFVAR(&JOB 11)                                       
             DCL        VAR(&NBR) TYPE(*CHAR) STG(*DEFINED) LEN(6) +            
                          DEFVAR(&JOB 21)                                       
                                                                                
             DCL        VAR(&INTJOBNO) TYPE(*CHAR) LEN(16) VALUE(' ')           
                                                                                
             CHGVAR     VAR(&JOB) VALUE(&NAME || &USER || &NBR)                 
             CALL       PGM(QUSRJOBI) PARM(&JOB_INF &RCVLEN +                   
                          'JOBI0600' &JOB &INTJOBNO)                            
                                                                                
             ENDPGM

↑の例では JOBI0600 という、かなりいろんな情報の載ってくるものを使用しています。

Offset Type Field
Dec Hex
0 0 BINARY(4) Number of bytes returned
4 4 BINARY(4) Number of bytes available
8 8 CHAR(10) Job name
18 12 CHAR(10) User name
28 1C CHAR(6) Job number
34 22 CHAR(16) Internal job identifier
50 32 CHAR(10) Job status
60 3C CHAR(1) Job type
61 3D CHAR(1) Job subtype
62 3E CHAR(8) Job switches
70 46 CHAR(1) End status
71 47 CHAR(10) Subsystem description name
81 51 CHAR(10) Subsystem description library name
91 5B CHAR(10) Current user profile
101 65 CHAR(1) DBCS-capable
102 66 CHAR(1) Exit key
103 67 CHAR(1) Cancel key
104 68 BINARY(4) Product return code
108 6C BINARY(4) User return code
112 70 BINARY(4) Program return code
116 74 CHAR(10) Special environment
126 7E CHAR(10) Device name
136 88 CHAR(10) Group profile name
146 92 ARRAY(15) of CHAR(10) Group profile name - supplemental
296 128 CHAR(10) Job user identity
306 132 CHAR(1) Job user identity setting
307 133 CHAR(15) Client IP address - IPv4
322 142 CHAR(2) Reserved
324 144 BINARY(4) Offset to time zone information
328 148 BINARY(4) Length of time zone information
  CHAR(*) Time zone information (See Format of Time Zone Information for more information.)

JOBI0600 というのは「活動中のジョブについての情報」を返すフォーマット、とインフォメーション・センターに載っているのですが、WATCH で監視するジョブは当然「活動中のジョブ」なので、まさしくうってつけというわけです。

ジョブ情報をセットして CALL すれば指定しておいた変数に情報が返ってくる、というシンプルな使用方法も CL ではとても便利です。

たとえば↓のようにサブルーチンに組み込んでも使用できますね。

/*                                                                */              
/*   CRTBNDCL PGM(SQLWATCH/WCH_SQLMSG) SRCFILE(SQLWATCH/QCLSRC) + */                
/*              LOG(*YES) DBGVIEW(*SOURCE)                      + */                
/*                                                                */              
/*                                                                */              
/*   STRWCH SSNID(WCH_SQLMSG) WCHPGM(SQLWATCH/WCH_SQLMSG)  +      */               
/*          WCHMSG((SQL0904) (SQL0913))                    +      */               
/*          WCHMSGQ((*JOBLOG))                             +      */               
/*          WCHJOB((*ALL/QZDASOINIT))                      +      */               
/*  自分を入れないようにしておかないと                     +      */               
/*  自分が出したメッセージでまた再帰的に呼ばれてしまうので注意 +  */               
/*                                                                */              
                                                                                
             PGM        PARM(&TYPE &SESSION &ERROR &DATA)                       
                                                                                
   /* INPUT PARMS */                                                            
             DCL        VAR(&TYPE) TYPE(*CHAR) LEN(10)                          
             DCL        VAR(&SESSION) TYPE(*CHAR) LEN(10)                       
             DCL        VAR(&ERROR) TYPE(*CHAR) LEN(10)                         
             DCL        VAR(&DATA) TYPE(*CHAR) LEN(1024)                        
                                                                                
   /* RECEIVE DATA */                                                           
             DCL        VAR(&MSGID) TYPE(*CHAR) STG(*DEFINED) LEN(7) +          
                          DEFVAR(&DATA 5)                                       
             DCL        VAR(&MSGF) TYPE(*CHAR) STG(*DEFINED) LEN(10) +          
                          DEFVAR(&DATA 391)                                     
             DCL        VAR(&OFFSET) TYPE(*INT) STG(*DEFINED) LEN(4) +          
                          DEFVAR(&DATA 441)                                     
             DCL        VAR(&MSGDTAP) TYPE(*PTR)                                
             DCL        VAR(&MSGDTA) TYPE(*CHAR) STG(*BASED) +                  
                          LEN(1024) BASPTR(&MSGDTAP)                            
                                                                                
             DCL        VAR(&JOBNAME) TYPE(*CHAR) STG(*DEFINED) +               
                          LEN(10) DEFVAR(&DATA 33)                              
             DCL        VAR(&JOBUSER) TYPE(*CHAR) STG(*DEFINED) +               
                          LEN(10) DEFVAR(&DATA 43)                              
             DCL        VAR(&JOBNBR) TYPE(*CHAR) STG(*DEFINED) +                
                          LEN(6) DEFVAR(&DATA 53)                   

   /* FOR SUBR GETJOBINF */                                                     
             DCL        VAR(&JOB_INF) TYPE(*CHAR) LEN(1024)                     
             DCL        VAR(&SBSNAME) TYPE(*CHAR) STG(*DEFINED) +               
                          LEN(10) DEFVAR(&JOB_INF 72)                           
             DCL        VAR(&CURUSER) TYPE(*CHAR) STG(*DEFINED) +               
                          LEN(10) DEFVAR(&JOB_INF 92)                           
             DCL        VAR(&RCVLEN) TYPE(*INT) VALUE(1024)                     
             DCL        VAR(&INTJOBNO) TYPE(*CHAR) LEN(16) VALUE(' ')           
                                                                                
             DCL        VAR(&MSGTEXT) TYPE(*CHAR) LEN(128)                      
                                                                                
   /* PROCEDURE */                                                              
             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         

      /* WHEN YOU DO NOT NEED TO BE NOTIFIED */                                   
             CALLSUBR   SUBR(GETJOBINF)                                       
             IF         COND(%SST(&CURUSER 1 1) *NE 'Q') THEN(DO)            
          /* IF         COND(&SBSNAME = 'QBATCH') THEN(DO) */ 
             GOTO       CMDLBL(EXIT)                                            
             ENDDO                                                              
                                                                                
      /* WHEN SQL0904 OR SQL0913 IS CAUGHT */                                   
             IF         COND((%SST(&TYPE 1 6) = '*MSGID') & ((&MSGID +          
                          = 'SQL0904') | (&MSGID = 'SQL0913'))) +               
                          THEN(GOTO CMDLBL(SNDMSG))                             
             ELSE       CMD(GOTO CMDLBL(EXIT))                                  
                                                                                
 SNDMSG:     DO                                                                 
                                                                                
      /* PRINT JOBLOG OF THE JOB */                                             
             DSPJOBLOG  JOB(&JOBNBR/&JOBUSER/&JOBNAME) OUTPUT(*PRINT)           
                                                                                
      /* SEND MSG TO SYSOPR */                                                  
         /* DEFAULT GUIDE MESSAGE */                                            
             CHGVAR     VAR(&MSGTEXT) VALUE(&JOBNBR |< '/' || +                 
                          &JOBUSER |< '/' || &JOBNAME |< +                      
                          'で次のメッセージが発生しています!')                  
                                                                                
         /* WHEN MSGID IS SQL0913 (RECORD LOCK) */                              
             IF         COND(&MSGID = 'SQL0913') THEN(CHGVAR +                  
                          VAR(&MSGTEXT) VALUE(&JOBNBR |< '/' || +               
                          &JOBUSER |< '/' || &JOBNAME |< +                      
                          'でレコードロック発見!詳細は次のメッセ+               
                          ージを参照ください!'))                               

         /* CONDITIONALY MESSAGE FOR ANOTHER MSGID CAN BE OVERRIDDEN */        
         /*  IF         COND(&MSGID = 'xxxxxx') THEN(CHGVAR +                  
                          VAR(&MSGTEXT) VALUE( any messages )        */       
                                                                                
         /* SEND GUIDE MESSAGE */                                               
             SNDPGMMSG  MSG(&MSGTEXT) TOUSR(*SYSOPR) MSGTYPE(*INFO)             
                                                                                
         /* SEND 'WATCH'ED MESSAGE */                                           
             CHGVAR     VAR(&MSGDTAP) VALUE(%ADDR(&DATA))                       
             CHGVAR     VAR(%OFFSET(&MSGDTAP)) +                                
                          VALUE(%OFFSET(&MSGDTAP) + &OFFSET)                    
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGF) MSGDTA(&MSGDTA) +             
                          TOUSR(*SYSOPR) MSGTYPE(*INFO)                         
                                                                                
      /* DONE AND EXIT */                                                       
             CHGVAR     VAR(&ERROR) VALUE('          ')                         
             GOTO       CMDLBL(EXIT)                                            
             ENDDO                                                              
                                                                                
 ERROR:      CHGVAR     VAR(&ERROR) VALUE('*ERROR    ')                         

      /* GETJOBINF SUBR */                                                       
             SUBR       SUBR(GETJOBINF)                                         
             CHGVAR     VAR(&JOB) VALUE(&JOBNAME || &JOBUSER || +               
                          &JOBNBR)                                              
             CALL       PGM(QUSRJOBI) PARM(&JOB_INF &RCVLEN +                   
                          'JOBI0600' &JOB &INTJOBNO)                            
             ENDSUBR       
                                                                                
 EXIT:       ENDPGM

ちなみに、↑は例によって知人からいただいたもので、ちょっと変更して使わせてもらっています。

[Top Pageに戻る]

Ads by TOK2