常駐サーバージョブの監視と起動 (パフォーマンスツール/マネージメント・セントラル)

システムでパフォーマンスデータの収集を行っているのだけれど、時々勝手に終了してしまっている、という問題があり、
こちらの応用で、収集サービスをチェックして、落ちていたら再度起動を行う、という仕様のプログラムを作成しました。

ADDJOBSCDE で適当な時間間隔で実行させるようにしています。

プログラムのソースはこちらです。
CHKACTJOB のコマンド処理プログラムの前半をそのまま使用しています。

パフォーマンスデータ収集のチェックと起動

パフォーマンスツールでのデータ収集は以下のコマンドで行っています。

CALL PGM(QYPSSTRC) PARM('*PFR   ' '*STANDARDP' '' )

QYPSSTRC とは「コレクターの開始」を行う API で、最初のパラメータがコレクター名 (V5R1 では *PFR というのが特殊値としてあり、QYPSPFRCOL が使用される)、次が収集プロファイルで *STANDARD/*STANDARDP/*MINIMUM/*ENHCPCPLN などが指定できます。最後のパラメータはエラーの戻りで、通常は X'00000000' などを指定しますが、上記のように空欄でも動きました。

開始したものは QYPSCSCA API を使用して属性を変更できます。
例えばこんなかんじです。

CALL PGM(QYPSCSCA) PARM('*PFR   '
                    X'00000384' /* 15分(900秒)間隔 */
                     'QPFRDATA ' /* ライブラリー */
                    X'00000018' /* 保存期間 24時間 */
                    X'00000000' /* 循環同期時刻 00:00:00 */
                    X'00000018' /* 循環同期頻度 24時間 */
                     X'00000001' /* CRTPFRDTA */
                     '*STANDARDP' /* 収集プロファイル */
                    X'00000000' /* リターンコード */
                    )

上の 2つを組み合わせれば収集サービスを開始/変更するコマンドは簡単に作れそうですね。

        *************** データの始め ****************                           
0001.00              DCL        VAR(&JOBPARM) TYPE(*CHAR) LEN(26)               
0002.00              DCL        VAR(&JOB) TYPE(*CHAR) LEN(10)                   
0003.00              DCL        VAR(&USR) TYPE(*CHAR) LEN(10)                   
0004.00              DCL        VAR(&NBR) TYPE(*CHAR) LEN(6)                    
0005.00              DCL        VAR(&STS) TYPE(*CHAR) LEN(10)                   
0006.00              DCL        VAR(&OBJ) TYPE(*CHAR) LEN(10)                   
0007.00              DCL        VAR(&USRSPC) TYPE(*CHAR) LEN(20) +              
0008.00                           VALUE('CHKACTJOB QTEMP     ')                 
0009.00              DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(10)               
0010.00              DCL        VAR(&USRNAME) TYPE(*CHAR) LEN(10)               
0011.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)                 
0012.00              DCL        VAR(&JOBSTS) TYPE(*CHAR) LEN(10)                
0013.00              DCL        VAR(&LSTJOBE) TYPE(*CHAR) LEN(52)               
0014.00              DCL        VAR(&BIN4) TYPE(*CHAR) LEN(4)                   
0015.00              DCL        VAR(&ENTRY) TYPE(*DEC) LEN(8 0)                 
0016.00              DCL        VAR(&STR) TYPE(*DEC) LEN(8 0)                   
0017.00              DCL        VAR(&OFFSET) TYPE(*DEC) LEN(8 0)                
0018.00              DCL        VAR(&OFFSETB) TYPE(*CHAR) LEN(4)                
0019.00              DCL        VAR(&ENTLEN) TYPE(*DEC) LEN(8 0)                
0020.00              DCL        VAR(&ENTLENB) TYPE(*CHAR) LEN(4)                
0021.00              IF         COND(&JOB = '          ') THEN(CHGVAR +         
0022.00                           VAR(&JOB) VALUE('QYPSPFRCOL'))                
0023.00              IF         COND(&USR = '          ') THEN(CHGVAR +         
0024.00                           VAR(&USR) VALUE('*ALL     '))                 
0025.00              IF         COND(&NBR = '      ') THEN(CHGVAR VAR(&NBR) +   
0026.00                           VALUE('*ALL  '))                              
0027.00              IF         COND(&STS = '          ') THEN(CHGVAR +         
0028.00                           VAR(&STS) VALUE('*ACTIVE  '))                 
0029.00              CHGVAR     VAR(&OBJ) VALUE(%SST(&USRSPC 1 10))             
0030.00              DLTUSRSPC  USRSPC(QTEMP/&OBJ)                              
0031.00              MONMSG     MSGID(CPF0000)                                  
0032.00              CALL       PGM(QUSCRTUS) PARM(&USRSPC 'CHKACTJOB ' +       
0033.00                           X'00000100' ' ' '*ALL      ' 'CHKACTJOB +     
0034.00                           TEMPORARY USER SPACE')                        
0035.00              CHGVAR     VAR(%SST(&JOBPARM 1 10)) VALUE(&JOB)            
0036.00              CHGVAR     VAR(%SST(&JOBPARM 11 10)) VALUE(&USR)           
0037.00              CHGVAR     VAR(%SST(&JOBPARM 21 6)) VALUE(&NBR)            
0038.00              CALL       PGM(QUSLJOB) PARM(&USRSPC 'JOBL0100' +          
0039.00                           &JOBPARM &STS)                                
0040.00              CALL       PGM(QUSRTVUS) PARM(&USRSPC X'00000085' +        
0041.00                           X'00000004' &BIN4)                            
0042.00              CHGVAR     VAR(&ENTRY) VALUE(%BIN(&BIN4))                  
0043.00              IF         COND(&ENTRY = 0) THEN(DO)                       
0044.00              SNDPGMMSG  +                                               
0045.00                           MSG('収集サービスが開始されていません。 
0046.00                           開始を行います。') MSGTYPE(*COMP)   
0047.00              SBMJOB     CMD(CALL PGM(QYPSSTRC) PARM('*PFR      ' +      
0048.00                           '*STANDARDP' '')                        )     
0049.00                           ENDDO                                         
        ***************** データの終わり ************************************** 
                                                                     

マネージメント・セントラル・サーバーのチェックと起動

マネージメント・セントラル・サーバーが稼動していない場合も同様に以下のように変更して使用できます。

あまりよくあることではないのですが、収集サービスと同様にごくたまにマネージメント・セントラル・サーバーがいつのまにか落ちてしまっていることがあります。その場合、オペレーション・ナビゲーターのシステム・モニター機能などに支障が出ることがあります。
適当な時間間隔でマネージメント・セントラル・サーバーの稼動 (経験上 QYPSSRV が気がつくといなくなっていることが多い) をチェックして、再度起動をかけてやることで対処することができます。

こちらの例は、さらにこんなこともできるかな、といったかんじで作って見たもので、かなり原始的なレベルです。いろいろ運用してみて直していかないといけないですね。

        *************** データの始め ****************                           
0001.00              PGM        PARM(&ENDTIME)                                  
0002.00              DCL        VAR(&TIME) TYPE(*CHAR) LEN(6)                   
0003.00              DCL        VAR(&TIMED) TYPE(*DEC) LEN(6 0)                 
0004.00              DCL        VAR(&ENDTIME) TYPE(*CHAR) LEN(6)                
0005.00              DCL        VAR(&ENDTIMED) TYPE(*DEC) LEN(6 0)              
0006.00              DCL        VAR(&JOBPARM) TYPE(*CHAR) LEN(26)               
0007.00              DCL        VAR(&JOB) TYPE(*CHAR) LEN(10)                   
0008.00              DCL        VAR(&USR) TYPE(*CHAR) LEN(10)                   
0009.00              DCL        VAR(&NBR) TYPE(*CHAR) LEN(6)                    
0010.00              DCL        VAR(&STS) TYPE(*CHAR) LEN(10)                   
0011.00              DCL        VAR(&OBJ) TYPE(*CHAR) LEN(10)                   
0012.00              DCL        VAR(&USRSPC) TYPE(*CHAR) LEN(20) +              
0013.00                           VALUE('CHKACTJOB QTEMP     ')                 
0014.00              DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(10)               
0015.00              DCL        VAR(&USRNAME) TYPE(*CHAR) LEN(10)               
0016.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)               
0017.00              DCL        VAR(&JOBSTS) TYPE(*CHAR) LEN(10)                
0018.00              DCL        VAR(&LSTJOBE) TYPE(*CHAR) LEN(52)               
0019.00              DCL        VAR(&BIN4) TYPE(*CHAR) LEN(4)                   
0020.00              DCL        VAR(&ENTRY) TYPE(*DEC) LEN(8 0)                 
0021.00              DCL        VAR(&STR) TYPE(*DEC) LEN(8 0)                   
0022.00              DCL        VAR(&OFFSET) TYPE(*DEC) LEN(8 0)                
0023.00              DCL        VAR(&OFFSETB) TYPE(*CHAR) LEN(4)                
0024.00              DCL        VAR(&ENTLEN) TYPE(*DEC) LEN(8 0)                
0025.00              DCL        VAR(&ENTLENB) TYPE(*CHAR) LEN(4)                
0026.00              IF         COND(&ENDTIME = '      ') THEN(CHGVAR +         
0027.00                           VAR(&ENDTIME) VALUE('235900'))                
0028.00              CHGVAR     VAR(&ENDTIMED) VALUE(&ENDTIME)                  
0029.00              IF         COND(&JOB = '          ') THEN(CHGVAR +         
0030.00                           VAR(&JOB) VALUE('QYPSSRV   '))                
0031.00              IF         COND(&USR = '          ') THEN(CHGVAR +         
0032.00                           VAR(&USR) VALUE('*ALL     '))                 
0033.00              IF         COND(&NBR = '      ') THEN(CHGVAR VAR(&NBR) +     
0034.00                           VALUE('*ALL  '))                              
0035.00              IF         COND(&STS = '          ') THEN(CHGVAR +         
0036.00                           VAR(&STS) VALUE('*ACTIVE  '))                 
0037.00              CHGVAR     VAR(&OBJ) VALUE(%SST(&USRSPC 1 10))             
0038.00              DLTUSRSPC  USRSPC(QTEMP/&OBJ)                              
0039.00              MONMSG     MSGID(CPF0000)                                  
0040.00              CALL       PGM(QUSCRTUS) PARM(&USRSPC 'CHKACTJOB ' +       
0041.00                           X'00000100' ' ' '*ALL      ' 'CHKACTJOB +     
0042.00                           TEMPORARY USER SPACE')                        
0043.00              CHGVAR     VAR(%SST(&JOBPARM 1 10)) VALUE(&JOB)            
0044.00              CHGVAR     VAR(%SST(&JOBPARM 11 10)) VALUE(&USR)           
0045.00              CHGVAR     VAR(%SST(&JOBPARM 21 6)) VALUE(&NBR)            
0046.00  LOOP:       CALL       PGM(QUSLJOB) PARM(&USRSPC 'JOBL0100' +          
0047.00                           &JOBPARM &STS)                                
0048.00              CALL       PGM(QUSRTVUS) PARM(&USRSPC X'00000085' +        
0049.00                           X'00000004' &BIN4)                            
0050.00              CHGVAR     VAR(&ENTRY) VALUE(%BIN(&BIN4))                
0051.00       /*     IF         COND(&ENTRY = 0) THEN(SNDPGMMSG +               
0052.00                           MSGID(CPF9897) MSGF(QCPFMSG) +                
0053.00                           MSGDTA('*MGTC サーバー・ジョブ QYPSSRV が +   
0054.00                            活動中ではない。 ') TOMSGQ(*SYSOPR)) */      
0055.00              IF         COND(&ENTRY = 0) THEN(DO)                       
0056.00              ENDTCPSVR  SERVER(*MGTC)                                   
0057.00              DLYJOB     DLY(45)                                         
0058.00              STRTCPSVR  SERVER(*MGTC)                                   
0059.00              ENDDO                                                      
0060.00              RTVSYSVAL  SYSVAL(QTIME) RTNVAR(&TIME)                     
0061.00              CHGVAR     VAR(&TIMED) VALUE(&TIME)                        
0062.00              IF         COND(&TIMED > &ENDTIMED) THEN(GOTO +            
0063.00                           CMDLBL(EXIT))                                 
0064.00              DLYJOB     DLY(600)                                        
0065.00              GOTO       CMDLBL(LOOP)                                    
0066.00  EXIT:       ENDPGM                                                     
        ***************** データの終わり ************************************** 

若干汎用的になるように、監視したいサーバージョブと、監視の間隔、監視ジョブの終了時刻をわたして、さらに監視対象のサーバーが稼動していなかった場合はシステム操作員メッセージ待ち行列 (QSYSOPR) にメッセージを送る、というように変更してみました。
そのプログラムの雛形みたいなものが以下になります。

        *************** データの始め ****************                           
0001.00              PGM        PARM(&JOB &INTERVAL &ENDTIME)                   
0002.00              DCL        VAR(&TIME) TYPE(*CHAR) LEN(6)                   
0003.00              DCL        VAR(&TIMED) TYPE(*DEC) LEN(6 0)                 
0004.00              DCL        VAR(&INTERVAL) TYPE(*CHAR) LEN(4)               
0005.00              DCL        VAR(&INTERVALD) TYPE(*DEC) LEN(4 0)             
0006.00              DCL        VAR(&ENDTIME) TYPE(*CHAR) LEN(6)                
0007.00              DCL        VAR(&ENDTIMED) TYPE(*DEC) LEN(6 0)              
0008.00              DCL        VAR(&JOBPARM) TYPE(*CHAR) LEN(26)               
0009.00              DCL        VAR(&JOB) TYPE(*CHAR) LEN(10)                   
0010.00              DCL        VAR(&USR) TYPE(*CHAR) LEN(10)                   
0011.00              DCL        VAR(&NBR) TYPE(*CHAR) LEN(6)                    
0012.00              DCL        VAR(&STS) TYPE(*CHAR) LEN(10)                   
0013.00              DCL        VAR(&OBJ) TYPE(*CHAR) LEN(10)                   
0014.00              DCL        VAR(&USRSPC) TYPE(*CHAR) LEN(20) +              
0015.00                           VALUE('CHKACTJOB QTEMP     ')                 
0016.00              DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(10)               
0017.00              DCL        VAR(&USRNAME) TYPE(*CHAR) LEN(10)               
0018.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)                 
0019.00              DCL        VAR(&JOBSTS) TYPE(*CHAR) LEN(10)                
0020.00              DCL        VAR(&LSTJOBE) TYPE(*CHAR) LEN(52)               
0021.00              DCL        VAR(&BIN4) TYPE(*CHAR) LEN(4)                   
0022.00              DCL        VAR(&ENTRY) TYPE(*DEC) LEN(8 0)                 
0023.00              DCL        VAR(&STR) TYPE(*DEC) LEN(8 0)                   
0024.00              DCL        VAR(&OFFSET) TYPE(*DEC) LEN(8 0)                
0025.00              DCL        VAR(&OFFSETB) TYPE(*CHAR) LEN(4)                
0026.00              DCL        VAR(&ENTLEN) TYPE(*DEC) LEN(8 0)                
0027.00              DCL        VAR(&ENTLENB) TYPE(*CHAR) LEN(4)                
0028.00              IF         COND(&ENDTIME = '      ') THEN(CHGVAR +         
0029.00                           VAR(&ENDTIME) VALUE('235900'))                
0030.00              CHGVAR     VAR(&ENDTIMED) VALUE(&ENDTIME)                  
0031.00              IF         COND(&INTERVAL = '    ') THEN(CHGVAR +          
0032.00                           VAR(&INTERVAL) VALUE('0300'))                 
0033.00              CHGVAR     VAR(&INTERVALD) VALUE(&INTERVAL)                
0034.00      /* SET DEFAULT IF REQUIRED */                                      
0035.00      /*      IF         COND(&JOB = '          ') THEN(CHGVAR +         
0036.00                           VAR(&JOB) VALUE('XXXXXXXXXX'))  */            
0037.00              IF         COND(&USR = '          ') THEN(CHGVAR +         
0038.00                           VAR(&USR) VALUE('*ALL     '))                 
0039.00              IF         COND(&NBR = '      ') THEN(CHGVAR VAR(&NBR) +   
0040.00                           VALUE('*ALL  '))                              
0041.00              IF         COND(&STS = '          ') THEN(CHGVAR +         
0042.00                           VAR(&STS) VALUE('*ACTIVE  '))                 
0043.00              CHGVAR     VAR(&OBJ) VALUE(%SST(&USRSPC 1 10))             
0044.00              DLTUSRSPC  USRSPC(QTEMP/&OBJ)                              
0045.00              MONMSG     MSGID(CPF0000)                                  
0046.00              CALL       PGM(QUSCRTUS) PARM(&USRSPC 'CHKACTJOB ' +       
0047.00                           X'00000100' ' ' '*ALL      ' 'CHKACTJOB +     
0048.00                           TEMPORARY USER SPACE')                        
0049.00              CHGVAR     VAR(%SST(&JOBPARM 1 10)) VALUE(&JOB)            
0050.00              CHGVAR     VAR(%SST(&JOBPARM 11 10)) VALUE(&USR)           
0051.00              CHGVAR     VAR(%SST(&JOBPARM 21 6)) VALUE(&NBR)            
0052.00  LOOP:       CALL       PGM(QUSLJOB) PARM(&USRSPC 'JOBL0100' +          
0053.00                           &JOBPARM &STS)                                
0054.00              CALL       PGM(QUSRTVUS) PARM(&USRSPC X'00000085' +        
0055.00                           X'00000004' &BIN4)                            
0056.00              CHGVAR     VAR(&ENTRY) VALUE(%BIN(&BIN4))                  
0057.00              IF         COND(&ENTRY = 0) THEN(DO)                       
0058.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) +                  
0059.00                           MSGDTA(' サーバー・ジョブ ' |< &JOB |< +      
0060.00                           ' が活動中ではない。 ') TOMSGQ(*SYSOPR)       
0061.00      /* ADD EXTRA ACTION IF REQUIRED */                                 
0062.00              ENDDO                                                      
0063.00              RTVSYSVAL  SYSVAL(QTIME) RTNVAR(&TIME)                     
0064.00              CHGVAR     VAR(&TIMED) VALUE(&TIME)                        
0065.00              IF         COND(&TIMED > &ENDTIMED) THEN(GOTO +            
0066.00                           CMDLBL(EXIT))                                 
0067.00              DLYJOB     DLY(&INTERVALD)                                 
0068.00              GOTO       CMDLBL(LOOP)                                    
0069.00  EXIT:       ENDPGM                                                     
        ***************** データの終わり **************************************

[Top Pageに戻る]

Ads by TOK2