Tools

50. CLROUTQ で大丈夫じゃないときには CLRLOG コマンドで !!

CLROUTQ でOUTQのスプールを確かに全部、削除することができるのだが
IBM が用意した CLROUTQコマンドは、それだけでは実用的に完全なものではない。
なぜなら実際の運用上では、すべてのスプールを消すのではなく
特定の重要な残しておきたいスプールもある。
CLROUTQを使ったのではすべてのスプールが消去されてしまうので
手動で消すことになるのだが手動でいちいち指定して消すのは、それもまた
大変面倒な作業が発生するのも事実である。

そこで EnterpriseServerAutoWeb で用意されている CLRLOGコマンドを
ここで紹介しよう。
CLRLOGコマンドはやはり元々CLROUTQで代用されていたのだが
やはりどうしても残しておきたいログが発生する。
残しておきたいログだけはHOLDにして保留しておくと
それだけは消去されずに残しておくことができる。

実際にCLRLOGコマンドで運用してみると実に便利で実用的であるとともに
洗練された機能性を感じることができる。
原理は簡単なCMDとCLPだけの組み合わせであるが
一度でも実際に使ってみるとその便利さに気づくことは間違いない。
CLRLOGコマンドは社内事情に応じてカスタマイズするのもよいだろう。

IBM では気づかなかった実用性を感じてもらえれば幸いである。

CLRLOG実行画面
【コマンド: CLRLOG】
0001.00              CMD        PROMPT(' ログの消去 ')                        
0002.00              PARM       KWD(CLRLOG) TYPE(CLRLOG) +                    
0003.00                           PROMPT(' ログ印刷待ち行列 ')                
0004.00  CLRLOG:     QUAL       TYPE(*NAME) LEN(10) DFT(QNETJOBLOG) +         
0005.00                           SPCVAL((*NONE))                             
0006.00              QUAL       TYPE(*NAME) LEN(10) DFT(ASNET.USR) +          
0007.00                           SPCVAL((*LIBL) (*CURLIB)) +                 
0008.00                           PROMPT(' ライブラリー ')                    
0009.00              PARM       KWD(CLRHLDLOG) TYPE(*CHAR) LEN(4) RSTD(*YES) +
0010.00                           DFT(*NO) VALUES(*YES *NO) +                 
0011.00                           PROMPT(' 保留 (HLD) 中のログの消去 ') 
【CLP: CLRLOGCL】
0001.00              PGM        PARM(&LOGOUTQLIB &CLRHLDLOG)                
0002.00 /*---------------------------------------------------------*/       
0003.00 /*   CLRLOG      :   ログの消去                            */       
0004.00 /*                                                         */       
0005.00 /*   2014/12/08: ASNET.USR/QNETLOGLOG の消去だけに限定した */       
0006.00 /*---------------------------------------------------------*/       
0007.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)              
0008.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)              
0009.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)              
0010.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)           
0011.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)           
0012.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)               
0013.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)            
0014.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +         
0015.00                           VALUE('*ESCAPE   ')                       
0016.00              DCL        VAR(&CLRHLDLOG) TYPE(*CHAR) LEN(4)          
0017.00              DCL        VAR(&LOGOUTQLIB) TYPE(*CHAR) LEN(20)        
0018.00              DCL        VAR(&CLRQ) TYPE(*CHAR) LEN(10)              
0019.00              DCL        VAR(&CLRQLIB) TYPE(*CHAR) LEN(10)           
0020.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +         
0021.00                           VALUE(X'000074') /* 2 進数  */               
0022.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +               
0023.00                           VALUE(X'00000000')                           
0024.00 /*( QUSRTVUS :  リストAPIで作成されたユーザー空間の検索 )*/         
0025.00              DCL        VAR(&STRPOS) TYPE(*CHAR) LEN(4) +              
0026.00                           VALUE(X'0000007D') /* 2 進数開始位置  : +    
0027.00                           125 */                                       
0028.00              DCL        VAR(&LENDTA) TYPE(*CHAR) LEN(4) +              
0029.00                           VALUE(X'00000010') /* 2 進数受取長さ  : 16 */
0030.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(16) +             
0031.00                           VALUE(X'0000000000000000')                   
0032.00              DCL        VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* +           
0033.00                           2 進数 dハl q */                              
0034.00              DCL        VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* +           
0035.00                           2 進数項目数  */                             
0036.00              DCL        VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* +           
0037.00                           2 進数リストサイズ  */                       
0038.00              DCL        VAR(&DEC08) TYPE(*DEC) LEN(8 0) /* WORK */     
0039.00              DCL        VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */    
0040.00              DCL        VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */     
0041.00              DCL        VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */
0042.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(1024) /* +      
0043.00                            受取データ  */                            
0044.00              DCL        VAR(&JOBID) TYPE(*CHAR) LEN(16)              
0045.00              DCL        VAR(&SPLID) TYPE(*CHAR) LEN(16)              
0046.00              DCL        VAR(&SPLA0100) TYPE(*CHAR) LEN(1024)         
0047.00              DCL        VAR(&SPLEN) TYPE(*CHAR) LEN(4) +             
0048.00                           VALUE(X'00000400')                         
0049.00 /*( スプール個別情報 )*/                                             
0050.00              DCL        VAR(&STATUS) TYPE(*CHAR) LEN(10)             
0051.00              DCL        VAR(&HOLD) TYPE(*CHAR) LEN(4)                
0052.00              DCL        VAR(&SPLF) TYPE(*CHAR) LEN(10)               
0053.00              DCL        VAR(&JOB) TYPE(*CHAR) LEN(10)                
0054.00              DCL        VAR(&USER) TYPE(*CHAR) LEN(10)               
0055.00              DCL        VAR(&JOBNO) TYPE(*CHAR) LEN(6)               
0056.00              DCL        VAR(&SPLNO) TYPE(*CHAR) LEN(4)               
0057.00              DCL        VAR(&SPLNO_D) TYPE(*DEC) LEN(8 0)            
0058.00              DCL        VAR(&DLTSU) TYPE(*CHAR) LEN(4) +             
0059.00                           VALUE(X'00000000')                         
0060.00              DCL        VAR(&HLDSU) TYPE(*CHAR) LEN(4) +             
0061.00                           VALUE(X'00000000')                         
0062.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))      
0063.00                                                                     
0064.00 /*( パラメータの取得 )*/                                            
0065.00              CHGVAR     VAR(&CLRQ) VALUE(%SST(&LOGOUTQLIB 01 10))   
0066.00              CHGVAR     VAR(&CLRQLIB) VALUE(%SST(&LOGOUTQLIB 11 10))
0067.00                                                                     
0068.00 /*( 環境の取得 )*/                                                  
0069.00              RTVJOBA    TYPE(&TYPE)                                 
0070.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */ 
0071.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')            
0072.00              ENDDO      /*  バッチ  */                              
0073.00              ELSE       CMD(DO) /*  対話式  */                      
0074.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')            
0075.00              ENDDO      /*  対話式  */                              
0076.00                                                                     
0077.00 /*( ジョブログだけの消去 )*/                                        
0078.00              IF         COND(&CLRHLDLOG *EQ '*YES') THEN(DO)        
0079.00              CLROUTQ    OUTQ(&CLRQLIB/&CLRQ)                        
0080.00              ENDDO                                                  
0081.00 /*( HLD のジョブログは消去しない )*/                                
0082.00              ELSE       CMD(DO) /* HLD の削除を除外  */             
0083.00   /*( 1. *USRSPC を作成する )*/                                     
0084.00              CALL       PGM(QUSCRTUS) PARM('SPLLIST   +              
0085.00                           QTEMP     ' 'PF        ' 1000 ' ' +        
0086.00                           '*ALL      ' 'QUSLSPL 用ユーザー空間 ' +   
0087.00                           '*YES      ' &APIERR)                      
0088.00              MONMSG     CPF9870                                      
0089.00   /*( 2. スプールの一覧表を作成する )*/                              
0090.00              CALL       PGM(QUSLSPL) PARM('SPLLIST   QTEMP     ' +   
0091.00                           'SPLF0100' '*ALL      ' &LOGOUTQLIB +      
0092.00                           '*ALL      ' '*ALL      ' &APIERR)         
0093.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) +
0094.00                           /* APIERR */                               
0095.00              GOTO     APIERR                                         
0096.00              ENDDO /* APIERR */                                      
0097.00   /*( 3. LOOP して個別にスプールを削除する )*/                       
0098.00      /*( リストデータセクションのオフセットを検索 )*/                
0099.00              CALL       PGM(QUSRTVUS) PARM('SPLLIST   QTEMP     ' +  
0100.00                           &STRPOS &LENDTA &RCVVAR)                   
0101.00              CHGVAR     VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4))        
0102.00              CHGVAR     VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4))        
0103.00              CHGVAR     VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4))       
0104.00                                                                      
0105.00          /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/             
0106.00              CHGVAR     VAR(&STRPOS) VALUE(&OFFSET)                   
0107.00              CHGVAR     VAR(&DEC08) VALUE(%BIN(&STRPOS))              
0108.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + 1)                 
0109.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)              
0110.00              CHGVAR     VAR(&LENDTA) VALUE(&LSTSIZ)                   
0111.00              CHGVAR     VAR(&ADDLEN) VALUE(%BIN(&LENDTA))             
0112.00              CHGVAR     VAR(&NOENT) VALUE(%BIN(&NOENTR))              
0113.00              IF         COND(&NOENT *EQ 0) THEN(DO)                   
0114.00              CHGVAR     VAR(&MSG) VALUE(&CLRQLIB *TCAT '/' +          
0115.00                           *CAT &CLRQ *TCAT +                          
0116.00                           ': この OUTQ にはスプールはありません。 ')  
0117.00              GOTO       SNDMSG                                        
0118.00              ENDDO                                                    
0119.00 NXTRTV:                                                               
0120.00              CALL       PGM(QUSRTVUS) PARM('SPLLIST   QTEMP     ' +   
0121.00                           &STRPOS &LENDTA &RCVDTA)                    
0122.00              /*( 処理の開始 )*/                                       
0123.00              CHGVAR     VAR(&JOBID) VALUE(%SST(&RCVDTA 51 16))        
0124.00              CHGVAR     VAR(&SPLID) VALUE(%SST(&RCVDTA 67 16))        
0125.00              CHGVAR     VAR(&SPLNO) VALUE(X'00000000')                
0126.00              CALL       PGM(QUSRSPLA) PARM(&SPLA0100 &SPLEN +        
0127.00                           'SPLA0100' '*INT                      ' +  
0128.00                           &JOBID &SPLID '*INT      ' &SPLNO &APIERR) 
0129.00              IF         COND(%SST(&APIERR 5 4) *NE &NULL4) THEN(DO) +
0130.00                           /* APIERR */                               
0131.00              GOTO     APIERR                                         
0132.00              ENDDO /* APIERR */                                      
0133.00              CHGVAR     VAR(&STATUS) VALUE(%SST(&SPLA0100 101 10))   
0134.00              CHGVAR     VAR(&HOLD) VALUE(%SST(&SPLA0100 121 4))      
0135.00              IF         COND(&HOLD *EQ '*YES') THEN(DO)              
0136.00              CHGVAR     VAR(%BIN(&HLDSU)) VALUE(%BIN(&HLDSU) + 1)    
0137.00              GOTO       BYPAS                                        
0138.00              ENDDO                                                   
0139.00              IF         COND(&STATUS *EQ '*READY    ') THEN(DO) /* + 
0140.00                            書出し可能  */                            
0141.00              CHGVAR     VAR(&SPLF) VALUE(%SST(&SPLA0100 67 10))      
0142.00              CHGVAR     VAR(&JOB) VALUE(%SST(&SPLA0100 41 10))       
0143.00              CHGVAR     VAR(&USER) VALUE(%SST(&SPLA0100 51 10))      
0144.00              CHGVAR     VAR(&JOBNO) VALUE(%SST(&SPLA0100 61 6))      
0145.00              CHGVAR     VAR(&SPLNO) VALUE(%SST(&SPLA0100 77 4))      
0146.00              CHGVAR     VAR(&SPLNO_D) VALUE(%BIN(&SPLNO))            
0147.00              DLTSPLF    FILE(&SPLF) JOB(&JOBNO/&USER/&JOB) +           
0148.00                           SPLNBR(&SPLNO_D) JOBSYSNAME(*ONLY)           
0149.00              CHGVAR     VAR(%BIN(&DLTSU)) VALUE(%BIN(&DLTSU) + 1)      
0150.00              ENDDO      /*  書出し可能  */                             
0151.00              ELSE       CMD(DO) /*  それ以外  */                       
0152.00              CHGVAR     VAR(%BIN(&HLDSU)) VALUE(%BIN(&HLDSU) + 1)      
0153.00              ENDDO      /*  それ以外  */                               
0154.00                                                                        
0155.00              /*( 処理の終了 )*/                                        
0156.00  BYPAS:      IF         COND(&N < &NOENT) THEN(DO)                     
0157.00              CHGVAR     VAR(&N) VALUE(&N + 1)                          
0158.00              CHGVAR     VAR(&DEC08)  VALUE(%BIN(&STRPOS))              
0159.00              CHGVAR     VAR(&DEC08) VALUE(&DEC08 + &ADDLEN)            
0160.00              CHGVAR     VAR(%BIN(&STRPOS)) VALUE(&DEC08)               
0161.00              GOTO       NXTRTV                                         
0162.00              ENDDO                                                     
0163.00 /*( 完了 )*/                                                           
0164.00              CHGVAR     VAR(&MSGID) VALUE('CPF3417')                   
0165.00              CHGVAR     VAR(&MSGDTA) VALUE(&DLTSU *CAT &HLDSU *CAT +   
0166.00                           &CLRQ *CAT &CLRQLIB)                         
0167.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                 
0168.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')             
0169.00              GOTO       SNDMSG                                        
0170.00              ENDDO      /* HLD の削除を除外  */                       
0171.00              RETURN                                                   
0172.00                                                                       
0173.00  APIERR:                                                              
0174.00              CHGVAR     VAR(&MSGID) VALUE(%SST(&APIERR 9 7))          
0175.00              CHGVAR     VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100))      
0176.00              CHGVAR     VAR(&MSGF) VALUE('QCPFMSG   ')                
0177.00              CHGVAR     VAR(&MSGFLIB) VALUE('QSYS      ')             
0178.00              GOTO       SNDMSG                                        
0179.00                                                                       
0180.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +           
0181.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 
0182.00                           MSGFLIB(&MSGFLIB)                           
0183.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                 
0184.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +   
0185.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)           
0186.00              ENDDO                                                    
0187.00              ELSE       CMD(DO)                                       
0188.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +          
0189.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +     
0190.00                           MSGTYPE(&MSGTYPE)                     
0191.00              ENDDO                                              
0192.00              ENDPGM
【解説】

CLP としてはステップ数が少しあるがたいしたことはない。
すべてのスプールを消去するのであれば

0079.00              CLROUTQ    OUTQ(&CLRQLIB/&CLRQ) 

が実行されるのだが CLRHLDLOG(*NO) として実行された場合は

0084.00              CALL       PGM(QUSCRTUS) PARM('SPLLIST

によってユーザー・スペース QTEMP/SPLLIST を作成しておいて、そこに

0090.00              CALL       PGM(QUSLSPL) PARM('SPLLIST   QTEMP     ' +

でスプール一覧表を出力して、これを

0120.00              CALL       PGM(QUSRTVUS) PARM('SPLLIST   QTEMP     ' + 

で繰返しスプールの数だけ読み取って

0126.00              CALL       PGM(QUSRSPLA) PARM(&SPLA0100 &SPLEN +

によってスプールの属性を調べる。

0139.00              IF         COND(&STATUS *EQ '*READY    ') THEN(DO)

のように RDY になっているスプールだけを

0147.00              DLTSPLF    FILE(&SPLF) JOB(&JOBNO/&USER/&JOB) +

によって削除する。といった具合である。