CLROUTQ でOUTQのスプールを確かに全部、削除することができるのだが
IBM が用意した CLROUTQコマンドは、それだけでは実用的に完全なものではない。
なぜなら実際の運用上では、すべてのスプールを消すのではなく
特定の重要な残しておきたいスプールもある。
CLROUTQを使ったのではすべてのスプールが消去されてしまうので
手動で消すことになるのだが手動でいちいち指定して消すのは、それもまた
大変面倒な作業が発生するのも事実である。
そこで EnterpriseServer や AutoWeb で用意されている CLRLOGコマンドを
ここで紹介しよう。
CLRLOGコマンドはやはり元々CLROUTQで代用されていたのだが
やはりどうしても残しておきたいログが発生する。
残しておきたいログだけはHOLD
にして保留しておくと
それだけは消去されずに残しておくことができる。
実際にCLRLOGコマンドで運用してみると実に便利で実用的であるとともに
洗練された機能性を感じることができる。
原理は簡単なCMDとCLPだけの組み合わせであるが
一度でも実際に使ってみるとその便利さに気づくことは間違いない。
CLRLOGコマンドは社内事情に応じてカスタマイズするのもよいだろう。
IBM では気づかなかった実用性を感じてもらえれば幸いである。
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) 中のログの消去 ')
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) +
によって削除する。といった具合である。