INTRDR
INTRDR:Internal reader,内部読み取りプログラム。
ジョブはJES2によって実行されますが、そのジョブを定義したJCLを読み取る機能がリーダーです。JES2のリーダーは元々、紙カードに記録されたJCLを読み取るため、カードリーダー・デバイスに対してI/Oを行っていました。今では紙カードもカードリーダーもまず使われることはなく、代わりにDASDや磁気テープ上のデータセットにJCLが作成されます。そこに書かれたJCLを読み取るのが、JES2のINTRDR(内部読み取りプログラム)です。
INTRDRはプログラムではあるものの、呼び出して使うサブルーチン的なものではなく、JCLのDD文に定義して使用するか、TSOやISPFなど対話処理のコマンドによって間接的に使用します。この時に使用されるコマンドがSUBMITであることから、INTRDRにジョブを読み取らせることを、JCLをサブミットするなどと呼んでいます。
INTRDRの使い方1
サブミットしたいジョブのJCLをGENERユーティリティなど、順次データセットのコピーを行うプログラムを使って、コピー先にSYSOUT、ライター名(出力プログラム名)として「INTRDR」を指定します。この場合クラスは省略するか適当なものでかまいません。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- //SUBMIT EXEC PGM=IEBGENER //SYSPRINT DD DUMMY //SYSUT1 DD DISP=SHR,DSN=MY.JCLLIB(TESTJOB1) //SYSUT2 DD SYSOUT=(,INTRDR) //SYSIN DD DUMMYMY.JCLLIB内のメンバーTESTJOB1が、JCLとして読み取られ実行されます。
INTRDRの使い方2
エディターやブラウザーでサブミットしたいジョブのJCLを開き、SUB[MIT]コマンドを実行することで、ジョブをサブミットできます。
TSOコマンド、SUBMITを使ってジョブをサブミットできます。パラメーターにサブミットするJCLの’データセット名(メンバー名)’を指定します。
TSOの場合は直接SUBMITコマンドを使うより、CLIST(コマンドプロシージャ)と組み合わせる方が一般的でしょう。CLIST内でサブミットするJCLそのものを生成することで、入力パラメーターや状況に応じてJCL内容を変更することもできます。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- /* /* SAMPLE CLIST: /* SUBMIT DATASET PRINT JOB. /* PROC 0 WRITENR PLEASE ENTER INPUT DATASET NAME ==> READ &INDSN SET &SYSOUTTRAP = 1 SUBMIT * END(##) //&SYSUID.A JOB //PRINT EXEC PGM=IEBGENER //SYSPRINT DD DUMMY //SYSUT1 DD DISP=SHR,DSN=&INDSN //SYSUT2 DD SYSOUT=* //SYSIN DD DUMMY // ## WRITE &SYSOUTLINE1MSPとVOS3ではSUBMITコマンドの入力ソースに端末やCLISTを指定できないので、一旦ワークデータセットに書き出し、そのデータセットをSUBMITコマンドで指定することになります。
/* /* SAMPLE CLIST: /* SUBMIT DATASET PRINT JOB. (MVS3.8) /* PROC 0 CONTROL NOFLUSH WRITENR PLEASE ENTER INPUT DATASET NAME ==> READ &INDSN /* SET &INDSN = USR1.JCL(IEHLIST) ALLOCATE DD(JCLWORK) DA(JCLWORK) UNIT(SYSALLDA) NEW TRACKS SPACE(1) OPENFILE JCLWORK OUTPUT SET &JCLWORK = &STR(//&SYSUID.A JOB ,&SYSUID,CLASS=A,MSGCLASS=C) PUTFILE JCLWORK SET &JCLWORK = &STR(//PRINT EXEC PGM=IEBGENER) PUTFILE JCLWORK SET &JCLWORK = &STR(//SYSPRINT DD DUMMY) PUTFILE JCLWORK SET &JCLWORK = &STR(//SYSUT1 DD DISP=SHR,DSN=&INDSN) PUTFILE JCLWORK SET &JCLWORK = &STR(//SYSUT2 DD SYSOUT=*) PUTFILE JCLWORK SET &JCLWORK = &STR(//SYSIN DD DUMMY) PUTFILE JCLWORK SET &JCLWORK = &STR(//) PUTFILE JCLWORK CLOSFILE JCLWORK SUBMIT JCLWORK FREE DD(JCLWORK) DELETE
INTRDRの使い方3
プログラムからINTRDRにJCLを書き出すこともできます。例えばCOBOLでJCLを作り、それを順次ファイルへ書き出せばジョブを実行できます。
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- //SUBMIT EXEC PGM=COBOLPGM //SYSUT2 DD SYSOUT=(,INTRDR) FILE-CONTROL. SELECT OUTFILE ASSIGN TO SYSUT2. * DATA DIVISION. FILE SECTION. FD OUTFILE RECORDING MODE IS F BLOCK CONTAINS 0 RECORDS RECORD CONTAINS 80 CHARACTERS. 01 OUTDATA PIC X(80). * WORKING-STORAGE SECTION. 01 I PIC 99 VALUE 0. 01 JCL. 02 R1 PIC X(80) VALUE '//JOBNAME JOB CLASS=A,MSGCLASS=C'. 02 R2 PIC X(80) VALUE '//PRINT EXEC PGM=IEBGENER'. 02 R3 PIC X(80) VALUE '//SYSPRINT DD DUMMY'. 02 R4 PIC X(80) VALUE '//SYSUT1 DD DISP=SHR,DSN=INPUT.PS'. 02 R5 PIC X(80) VALUE '//SYSUT2 DD SYSOUT=*'. 02 R6 PIC X(80) VALUE '//SYSIN DD DUMMY'. 01 JCLRECS REDEFINES JCL. 02 REC PIC X(80) OCCURS 6. * PROCEDURE DIVISION. * OPEN OUTPUT OUTFILE. LOOP. ADD 1 TO I. MOVE REC(I) TO OUTDATA. WRITE OUTDATA. IF I < 6 THEN GO TO LOOP. CLOSE OUTFILE * STOP RUN.プログラム内で定義したJCLデータが、SYSUT2に指定したINTRDRに書き出され、ジョブとして実行されます。
すでに紹介したGENERユーティリティや上記のCOBOLプログラムではINTRDRを順次データセットとして扱います。書き出したJCLを実際に実行させるにはデータセットをクローズさせる必要があります。しかしアセンブラープログラムならINTRDRをVSAMデータセットとして扱うことも可能です。複数のジョブをサブミットする場合でもCLOSE、再OPENを繰り返す必要はありません(ただしジョブの区切りとしてENDREQマクロを発行する)。またサブミットされたJOBのJOBIDが戻されるので、プログラムでJOBIDを処理に使うこともできます。
OPEN ACB OPEN INTRDR : LA R3,JCLDATA GR3 --> NEXT JCL CARD LOOP DS 0H ST R3,RPL+RPLAREA-IFGRPL SET PUT DATA AREA ADDRESS PUT RPL=RPL SEND OVER 1 CARD IMAGE LA R3,80(,R3) LOCATE TO NEXT CARD CLI 0(R3),X'FF' END OF JOB STREAM ? BNE LOOP NO, LOOP FOR NEXT CARD ENDREQ RPL=RPL GIVE JES2 END OF FILE LA R3,RPL+RPLRBAR-IFGRPL GR3 --> JOBID FIELD ADDRESS : : CLOSE ACB CLOSE INTRDR : : ACB ACB DDNAME=SYSUT2 ACB RPL RPL ACB=ACB,OPTCD=SEQ,AREALEN=80,RECLEN=80 JCLDATA DS 0H DC CL80'//JOBNAME JOB CLASS=A,MSGCLASS=C' DC CL80'//PRINT EXEC PGM=IEBGENER' DC CL80'//SYSPRINT DD DUMMY' DC CL80'//SYSUT1 DD DISP=SHR,DSN=INPUT.PS' DC CL80'//SYSUT2 DD SYSOUT=*' DC CL80'//SYSIN DD DUMMY' DC XL1'FF' END OF JCL INDICATOR : IFGRPL AM=VSAM RPLサンプルなのでエラーの判定を省略しています。正しく書き出されれば、JOBIDはRPLのRPLRBARフィールドに設定されます(CL8'JOBnnnnn')。
なおスプールや空きジョブ番号などのJES2リソースが不足した状態では、発行したPUTマクロまたはENDREQマクロが完了しません。この場合はJES2側で必要な対処を行う必要があります(例えば不要なジョブ出力を消去する)。応答がないからと言って、プログラムをキャンセルしても意味がありません。COBOLやTSOコマンドであっても同じです。