SPOOL

본 장에서는 SPOOL 데이터 셋과 SPOOL 백업방법에 대해 기술한다.

1. 개요

SPOOL은 JOB 수행에 필요한 입력 및 JOB 수행으로 생성된 결과물인 SPOOL 데이터셋을 담고 있는 볼륨을 지칭하거나 또는 SPOOL 데이터셋을 사용하는 오퍼레이션을 뜻한다.

JCL이 submit되면, TJES에서는 JOB에 유일한 JOBID를 부여하고 JOBQ에 등록한다. 이 때 부여된 JOBID 이름으로 SPOOL 볼륨에 SPOOL 공간이 할당된다. 그리고 INPJCL이라는 SPOOL 데이터셋이 생성된 후 JCL을 INPJCL에 복사한다. 이후의 JOB 수행에서는 INPJCL이 입력으로 사용된다.

tjclrun은 JOBID로 생성된 SPOOL 공간에 JESMSG, JESJCL, SYSMSG, CATPROC라는 이름의 SPOOL 데이터셋들과 JCL에 기술된 SYSOUT DD에 대한 SPOOL 데이터셋을 생성하고 JOB 수행에 사용한다.

생성된 SPOOL 데이터셋은 tjesmgr 명령어 또는 OpenFrame Manager를 통해서 내용을 확인할 수 있다.

2. SPOOL 데이터셋

SPOOL 데이터셋은 JOB이 수행될 때 기본적으로 생성되는 데이터셋(INPJCL, SYSMSG, CATPROC, CONVJCL, JESMSG, JESJCL)JCL에 SYSOUT으로 기술되어 생성되는 데이터셋이 있다.

다음은 데이터셋 TEST.DATASET1의 내용을 데이터셋 TEST.DATASET2, TEST.DATASET3으로 복사한 후 TEST.DATASET1을 삭제하는 JCL의 예이다.

<TESTPROC JCL>

//TESTPROC JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//STEP01   EXEC IBGPROC
//PS010.SYSUT1 DD DSN=TEST.DATASET1,DISP=(SHR,KEEP)
//PS010.SYSUT2 DD DSN=TEST.DATASET2,DISP=(NEW,CATLG),
//           DCB=(RECFM=FB,LRECL=10,BLKSIZE=100)
//STEP02   EXEC IBGPROC
//PS010.SYSUT1 DD DSN=TEST.DATASET1,DISP=(SHR,DELETE)
//PS010.SYSUT2 DD DSN=TEST.DATASET3,DISP=(NEW,CATLG),
//           DCB=(RECFM=FB,LRECL=10,BLKSIZE=100)

이 JCL은 CATALOGED PROCEDURE인 IBGPROC를 사용하는 2개의 STEP으로 되어 있다. IBGPROC의 내용은 다음과 같고 IEBGENER 유틸리티를 수행한다.

<IBGPROC>

//PS010   EXEC PGM=IEBGENER
//STEPLIB   DD DSN=SYS1.USERLIB,DISP=SHR
//          DD DSN=SYS1.TEMPLIB,DISP=SHR
//SYSPRINT  DD SYSOUT=*
//SYSUT1    DD DUMMY
//SYSUT2    DD DUMMY

JCL TESTPROC을 submit하여 실행하면 다음과 같은 SPOOL 데이터셋이 생성된다.

SPOOL LIST :
---------------------------------------------------------------------------
NO  STEP              DDNAME       SIZE  DSNAME
---------------------------------------------------------------------------
0   --------          INPJCL         409 INPJCL
1   --------          SYSMSG          5K SYSMSG
2   --------          CATPROC        444 CATPROC
3   --------          CONVJCL        791 CONVJCL
4   --------          JESMSG          1K JESMSG
5   --------          JESJCL          3K JESJCL
6   STEP01/PS010      SYSPRINT       463 oframe.TESTPROC.JOB00040.D000004
7   STEP02/PS010      SYSPRINT       463 oframe.TESTPROC.JOB00040.D000009
-----------------------------------------------------------------------------

2.1. 기본 데이터셋

본 절에서는 SPOOL LIST의 SPOOL 데이터셋 내용은 다음과 같다.

INPJCL

submit된 JCL이 복사되어 있다. 이후의 JOB 실행에서는 INPJCL의 내용을 사용한다.

//TESTPROC JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//STEP01   EXEC IBGPROC
//PS010.SYSUT1 DD DSN=TEST.DATASET1,DISP=(SHR,KEEP)
//PS010.SYSUT2 DD DSN=TEST.DATASET2,DISP=(NEW,CATLG),
//           DCB=(RECFM=FB,LRECL=10,BLKSIZE=100)
//STEP02   EXEC IBGPROC
//PS010.SYSUT1 DD DSN=TEST.DATASET1,DISP=(SHR,DELETE)
//PS010.SYSUT2 DD DSN=TEST.DATASET3,DISP=(NEW,CATLG),
//           DCB=(RECFM=FB,LRECL=10,BLKSIZE=100)
SYSMSG

JOB이 실행되는 동안 tjclrun이 생성한 메시지를 저장한다.

------------------------------------------------------------------------------
 ** Cataloged Procedure IBGPROC in SYS1.PROCLIB SCAN start **
------------------------------------------------------------------------------
------------------------------------------------------------------------------
 ** Cataloged Procedure IBGPROC in SYS1.PROCLIB SCAN start **
------------------------------------------------------------------------------
 JOBID=JOB00040   JOBPOS=0   RUNPID=2454
 TESTPROC JOB
 ==============================================================================
 --------------------------- STEP01 EXEC PROC step ----------------------------
 (JRN0210I) Start parsing Cataloged Procedure ...
 ---------------------------- PS010 EXEC PGM step -----------------------------
 (JRN0320I) SYSUT1   DD ALLOC - DSNAME=TEST.DATASET1
 (JRN0320I) SYSUT2   DD ALLOC - DSNAME=TEST.DATASET2
 (JRN0320I) STEPLIB  DD ALLOC - DSNAME=SYS1.USERLIB
 (JRN0320I) CONCATED DD ALLOC - DSNAME=SYS1.TEMPLIB
 (JRN0321I) SYSPRINT DD ALLOC - DSNAME=JOB00040(oframe.TESTPROC.JOB00040.D000004)
 --------------------------- STEP02 EXEC PROC step ----------------------------
 (JRN0210I) Start parsing Cataloged Procedure ...
 ---------------------------- PS010 EXEC PGM step -----------------------------
 (JRN0320I) SYSUT1   DD ALLOC - DSNAME=TEST.DATASET1
 (JRN0320I) SYSUT2   DD ALLOC - DSNAME=TEST.DATASET3
 (JRN0320I) STEPLIB  DD ALLOC - DSNAME=SYS1.USERLIB
 (JRN0320I) CONCATED DD ALLOC - DSNAME=SYS1.TEMPLIB
 (JRN0321I) SYSPRINT DD ALLOC - DSNAME=JOB00040(oframe.TESTPROC.JOB00040.D000009)
 (JRN0210I) Start parsing Cataloged Procedure ...
 (JRN0210I) Start parsing Cataloged Procedure ...
 ==============================================================================
 --------------------------- STEP01 EXEC PROC step ----------------------------
 (JRN0210I) Start parsing Cataloged Procedure ...
 ---------------------------- PS010 EXEC PGM step -----------------------------
 EXEC PGM=IEBGENER
 (JRN0129I) TACF CHECK UTILITY PROGRAM AUTH OK
 (JRN0320I) SYSUT1   DD ALLOC - DSNAME=TEST.DATASET1
 (JRN0320I) SYSUT2   DD ALLOC - DSNAME=TEST.DATASET2
 (JRN0320I) STEPLIB  DD ALLOC - DSNAME=SYS1.USERLIB
 (JRN0320I) CONCATED DD ALLOC - DSNAME=SYS1.TEMPLIB
 (JRN0321I) SYSPRINT DD ALLOC - DSNAME=JOB00040(oframe.TESTPROC.JOB00040.D000004)
 (JRN0044I) dsalc_report_start OK
 (JRN0240I) SYSPRINT DD in STEP01/PS010 open
 (JRN0335I) SYSUT1 DD in STEP01/PS010 exported
 (JRN0335I) SYSUT2 DD in STEP01/PS010 exported
 (JRN0335I) STEPLIB DD in STEP01/PS010 exported
 (JRN0335I) SYSPRINT DD in STEP01/PS010 exported
 (JRN0056I) coprocess child: argv[0]=IEBGENER
 (JRN0058I) pgm pid=2460
 (JRN0060I) Entering exec_pipe_loop() ...
 (JRN0301I) SYSIN DD to PGM done
 (JRN0245I) PGM closed stdout pipe
 (JRN0061I) Leaving exec_pipe_loop() ...
 (JRN0063I) pipe work done with coprocess child (PGM)
 (JRN0080I) PGM pid[2460] EXITED
 (JRN0065I) PS010 EXEC PGM step done with RC=0
 (JRN0073I) dsalc_report_info OK
 (JRN0069I) step res usage: real[   0.47] user[   0.05] system[   0.03] cuser[   0.01] csystem[   0.01]
 (JRN0070I) res usage: cpu_time[   0.10] proc_time=[   0.47]
 (JRN0345I) SYSUT1   DD DISPOSE COND=NORMAL
 (JRN0345I) SYSUT2   DD DISPOSE COND=NORMAL
 (JRN0345I) STEPLIB  DD DISPOSE COND=NORMAL
 (JRN0345I) CONCATED DD DISPOSE COND=NORMAL
 (JRN0345I) SYSPRINT DD DISPOSE COND=NORMAL
 --------------------------- STEP02 EXEC PROC step ----------------------------
 (JRN0210I) Start parsing Cataloged Procedure ...
 ---------------------------- PS010 EXEC PGM step -----------------------------
 EXEC PGM=IEBGENER
 (JRN0129I) TACF CHECK UTILITY PROGRAM AUTH OK
 (JRN0320I) SYSUT1   DD ALLOC - DSNAME=TEST.DATASET1
 (JRN0320I) SYSUT2   DD ALLOC - DSNAME=TEST.DATASET3
 (JRN0320I) STEPLIB  DD ALLOC - DSNAME=SYS1.USERLIB
 (JRN0320I) CONCATED DD ALLOC - DSNAME=SYS1.TEMPLIB
 (JRN0321I) SYSPRINT DD ALLOC - DSNAME=JOB00040(oframe.TESTPROC.JOB00040.D000009)
 (JRN0044I) dsalc_report_start OK
 (JRN0240I) SYSPRINT DD in STEP02/PS010 open
 (JRN0335I) SYSUT1 DD in STEP02/PS010 exported
 (JRN0335I) SYSUT2 DD in STEP02/PS010 exported
 (JRN0335I) STEPLIB DD in STEP02/PS010 exported
 (JRN0335I) SYSPRINT DD in STEP02/PS010 exported
 (JRN0056I) coprocess child: argv[0]=IEBGENER
 (JRN0058I) pgm pid=2467
 (JRN0060I) Entering exec_pipe_loop() ...
 (JRN0301I) SYSIN DD to PGM done
 (JRN0245I) PGM closed stdout pipe
 (JRN0061I) Leaving exec_pipe_loop() ...
 (JRN0063I) pipe work done with coprocess child (PGM)
 (JRN0080I) PGM pid[2467] EXITED
 (JRN0065I) PS010 EXEC PGM step done with RC=0
 (JRN0073I) dsalc_report_info OK
 (JRN0069I) step res usage: real[   0.42] user[   0.04] system[   0.02] cuser[   0.02] csystem[   0.02]
 (JRN0070I) res usage: cpu_time[   0.10] proc_time=[   0.42]
 (JRN0345I) SYSUT1   DD DISPOSE COND=NORMAL
 (JRN0345I) SYSUT2   DD DISPOSE COND=NORMAL
 (JRN0345I) STEPLIB  DD DISPOSE COND=NORMAL
 (JRN0345I) CONCATED DD DISPOSE COND=NORMAL
 (JRN0345I) SYSPRINT DD DISPOSE COND=NORMAL
 --------------------------- DATA SET UNALLOCATION ----------------------------
 (JRN0346I) SYSPRINT DD UNALLOC COND=NORMAL
 (JRN0346I) STEPLIB  DD UNALLOC COND=NORMAL
 (JRN0346I) SYSUT2   DD UNALLOC COND=NORMAL
 (JRN0346I) SYSUT1   DD UNALLOC COND=NORMAL
 (JRN0346I) SYSPRINT DD UNALLOC COND=NORMAL
 (JRN0346I) STEPLIB  DD UNALLOC COND=NORMAL
 (JRN0346I) SYSUT2   DD UNALLOC COND=NORMAL
 (JRN0346I) SYSUT1   DD UNALLOC COND=NORMAL
 (JRN0333I) JOB is enqueued for output processing -  JOBID=JOB00040, ABEND=0

다음은 SYSMSG에 저장되는 정보 중 step res usage와 res usage에 기록된 스텝이 실행 중 사용한 시스템 자원에 대한 설명이다.

  • step res usage

    필드 설명

    real

    해당 스텝의 실행시간이다. (단위: 초)

    user

    해당 스텝이 사용자 영역에서 사용한 CPU시간이다. (단위: 초)

    system

    해당 스텝이 시스템 영역(커널모드)에서 사용한 CPU 시간이다. (단위: 초)

    cuser

    스텝에서 생성한 child process가 사용자 영역에서 사용한 CPU 시간이다.

    (단위: 초)

    csystem

    스텝에서 생성한 child process가 시스템 영역(커널모드)에서 사용한 CPU 시간이다. (단위: 초)

  • res usage

    필드 설명

    cpu_time

    해당 스텝이 사용한 총 CPU 시간이다. (단위: 초)

    proc_time

    step res usage의 real과 같으며, 해당 스텝의 총 실행시간이다. (단위: 초)

    memory size

    -1로 고정한다.

CATPROC

JOB 실행에서 CATALOGED PROCEDURE를 사용할 때 프러시저의 내용을 저장한다.

XX-------- IBGPROC in SYS1.PROCLIB --------XX
//PS010   EXEC PGM=IEBGENER
//STEPLIB   DD DSN=SYS1.USERLIB,DISP=SHR
//          DD DSN=SYS1.TEMPLIB,DISP=SHR
//SYSPRINT  DD SYSOUT=*
//SYSUT1    DD DUMMY
//SYSUT2    DD DUMMY
XX-------- IBGPROC in SYS1.PROCLIB --------XX
//PS010   EXEC PGM=IEBGENER
//STEPLIB   DD DSN=SYS1.USERLIB,DISP=SHR
//          DD DSN=SYS1.TEMPLIB,DISP=SHR
//SYSPRINT  DD SYSOUT=*
//SYSUT1    DD DUMMY
//SYSUT2    DD DUMMY
CONVJCL

JOB 실행에서 전개된 PROCEDURE와 파라미터 값을 치환한 내용을 저장한다. CATALOGED PROCEDURE의 경우 'XX’로 출력되며, JCL INSTREAM PROCEDURE의 경우 '++'로 출력된다.

//TESTPROC JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//STEP01   EXEC IBGPROC
XX$DUMMY$ PROC
XXPS010   EXEC PGM=IEBGENER
XXSTEPLIB   DD DSN=SYS1.USERLIB,DISP=SHR
XX          DD DSN=SYS1.TEMPLIB,DISP=SHR
XXSYSPRINT  DD SYSOUT=*
//PS010.SYSUT1 DD DSN=TEST.DATASET1,DISP=(SHR,KEEP)
X/SYSUT1    DD DUMMY
//PS010.SYSUT2 DD DSN=TEST.DATASET2,DISP=(NEW,CATLG),
//           DCB=(RECFM=FB,LRECL=10,BLKSIZE=100)
X/SYSUT2    DD DUMMY
//STEP02   EXEC IBGPROC
XX$DUMMY$ PROC
XXPS010   EXEC PGM=IEBGENER
XXSTEPLIB   DD DSN=SYS1.USERLIB,DISP=SHR
XX          DD DSN=SYS1.TEMPLIB,DISP=SHR
XXSYSPRINT  DD SYSOUT=*
//PS010.SYSUT1 DD DSN=TEST.DATASET1,DISP=(SHR,DELETE)
X/SYSUT1    DD DUMMY
//PS010.SYSUT2 DD DSN=TEST.DATASET3,DISP=(NEW,CATLG),
//           DCB=(RECFM=FB,LRECL=10,BLKSIZE=100)
X/SYSUT2    DD DUMMY

JCL의 실행이 완전히 성공했을 경우에만 CONVJCL에 모든 내용이 출력되며, 중간에 문법 오류가 발생하는 경우에는 CONVJCL이 생성은 되지만 일부 내용만 출력 되거나 아예 출력되지 않을 수도 있다.

JESMSG

JOB과 관련된 정보와 각각의 STEP에 대한 정보가 저장된다.

---< JOB INFO >-----------------------------------------------------------------
 JOB  ID    : JOB00040
 JOB  NAME  : TESTPROC     NODENAME : NODE1
 JOB  CLASS : A , JOB STATUS : D(R00000) , JOB  PRTY : 5 , RUNNER INDEX : 8
 JOB  USER  : ROOT
 JCL  PATH  : /home/oframe/OpenFrame/volume_default/SYS1.JCLLIB/TESTPROC
 TIME STAMP : SUBM 20200122164142, EXEC 20200122164143, TERM 20200122164145
 RES  USAGE : CPU - 0s (p:1s) , 0%
---<STEP INFO>------------------------------------------------------------------
 STEP : [STEP01/PS010]
  CPU      0s(p: 0s)
  SYSUT1   TEST.DATASET1                                     R:10      W:0
  SYSUT2   TEST.DATASET2                                     R:0       W:10
  STEPLIB  SYS1.USERLIB                                      R:0       W:0
           SYS1.TEMPLIB                                      R:0       W:0
  SYSPRINT JOB00040(oframe.TESTPROC.JOB00040.D000004)        R:0       W:5
 STEP : [STEP02/PS010]
  CPU      0s(p: 0s)
  SYSUT1   TEST.DATASET1                                     R:10      W:0
  SYSUT2   TEST.DATASET3                                     R:0       W:10
  STEPLIB  SYS1.USERLIB                                      R:0       W:0
           SYS1.TEMPLIB                                      R:0       W:0
  SYSPRINT JOB00040(oframe.TESTPROC.JOB00040.D000009)        R:0       W:5

다음은 JESMSG에 저장되는 JOB 정보와 STEP 정보에 대한 설명이다.

  • JOB 정보

    필드 설명

    JOB ID

    할당된 JOB의 고유번호이다.

    JOB NAME

    JOB 이름이다.

    NODENAME

    JOB이 실행된 TJES 노드 이름이다.

    JOB CLASS

    JOB CLASS이다.

    JOB STATUS

    JOB의 현재 상태(반환값)이다.

    JOB PRTY

    실행한 JOB의 JOB 스케줄링 우선순위이다.

    RUNNER INDEX

    JOB을 실행한 Runner Slot 번호이다.

    JOB USER

    JOB을 실행한 사용자이다.

    JCL PATH

    USER가 submit한 JCL 파일의 위치 및 파일이름이다.

    TIME STAMP

    JOB이 submit된 시각, JOB 실행의 시작 및 종료 시각이다.

    RES USAGE

    JOB 실행에 사용된 CPU 시간을 나타낸다.

    • CPU

    • 0s : tjclrun 및 fork된 자식 프로세스의 CPU 사용량의 합

    • (p:2s) : tjclrun이 fork된 시점부터 종료 시까지의 시간(JOB 수행시간)

    • 0% : JOB 수행시간 대비 CPU 사용량

  • STEP 정보

    필드 설명

    STEP

    해당 JOBSTEP의 이름이다.

    CPU

    해당 JOBSTEP 처리에 사용된 CPU 시간(실제 처리시간)이다.

    SYSUT1

    해당 JOBSTEP에서 발생한 SYSUT1에 대한 I/O 카운트이다.

    SYSUT2

    해당 JOBSTEP에서 발생한 SYSUT2에 대한 I/O 카운트이다.

    STEPLIB

    해당 JOBSTEP에서 발생한 STEPLIB에 대한 I/O 카운트이다.

    SYSPRINT

    해당 JOBSTEP에서 발생한 SYSPRINT에 대한 I/O 카운트이다.

JESJCL

INPJCL에 대하여 JCL 문장의 parse tree가 저장된다.

JOB STREAM=[/home/oframe/OpenFrame/spool/JOB00040/INPJCL], JOBPOS=[0]
========================================================================
/JOB[name=TESTPROC,lineno=1]={
   |[key=CLASS]={STR,value=[A]}
   |[key=MSGCLASS]={STR,value=[X]}
   |[key=MSGLEVEL]={SUB,value={
   |   |[pos=1]={STR,value=[1]}
   |   |[pos=2]={STR,value=[1]}
   |}}
   |-------- child statements --------
   |/EXEC[name=STEP01,lineno=2]={
   |   |[pos=1]={STR,value=[IBGPROC]}
   |}
   |/DD[name=PS010.SYSUT1,lineno=3]={
   |   |[key=DSN]={STR,value=[TEST.DATASET1]}
   |   |[key=DISP]={SUB,value={
   |   |   |[pos=1]={STR,value=[SHR]}
   |   |   |[pos=2]={STR,value=[KEEP]}
   |   |}}
   |}
   |/DD[name=PS010.SYSUT2,lineno=4]={
   |   |[key=DSN]={STR,value=[TEST.DATASET2]}
   |   |[key=DISP]={SUB,value={
   |   |   |[pos=1]={STR,value=[NEW]}
   |   |   |[pos=2]={STR,value=[CATLG]}
   |   |}}
   |   |[key=DCB]={SUB,value={
   |   |   |[key=RECFM]={STR,value=[FB]}
   |   |   |[key=LRECL]={STR,value=[10]}
   |   |   |[key=BLKSIZE]={STR,value=[100]}
   |   |}}
   |}
   |/EXEC[name=STEP02,lineno=6]={
   |   |[pos=1]={STR,value=[IBGPROC]}
   |}
   |/DD[name=PS010.SYSUT1,lineno=7]={
   |   |[key=DSN]={STR,value=[TEST.DATASET1]}
   |   |[key=DISP]={SUB,value={
   |   |   |[pos=1]={STR,value=[SHR]}
   |   |   |[pos=2]={STR,value=[DELETE]}
   |   |}}
   |}
   |/DD[name=PS010.SYSUT2,lineno=8]={
   |   |[key=DSN]={STR,value=[TEST.DATASET3]}
   |   |[key=DISP]={SUB,value={
   |   |   |[pos=1]={STR,value=[NEW]}
   |   |   |[pos=2]={STR,value=[CATLG]}
   |   |}}
   |   |[key=DCB]={SUB,value={
   |   |   |[key=RECFM]={STR,value=[FB]}
   |   |   |[key=LRECL]={STR,value=[10]}
   |   |   |[key=BLKSIZE]={STR,value=[100]}
   |   |}}
   |}
}
========================================================================
CATALOGED PROCEDURE=[IBGPROC]
========================================================================
/PROC[name=$DUMMY$,lineno=2]={
   |-------- child statements --------
   |/EXEC[name=PS010,lineno=3]={
   |   |[pos=1,key=PGM]={STR,value=[IEBGENER]}
   |}
   |/DD[name=STEPLIB,lineno=4]={
   |   |[key=DSN]={STR,value=[SYS1.USERLIB]}
   |   |[key=DISP]={STR,value=[SHR]}
   |}
   |/DD[name=,lineno=5]={
   |   |[key=DSN]={STR,value=[SYS1.TEMPLIB]}
   |   |[key=DISP]={STR,value=[SHR]}
   |}
   |/DD[name=SYSPRINT,lineno=6]={
   |   |[key=SYSOUT]={STR,value=[*]}
   |}
   |/DD[name=SYSUT1,lineno=7]={
   |   |[pos=1]={STR,value=[DUMMY]}
   |}
   |/DD[name=SYSUT2,lineno=8]={
   |   |[pos=1]={STR,value=[DUMMY]}
   |}
}
/PEND[name=,lineno=8]={
}
CATALOGED PROCEDURE=[IBGPROC]
========================================================================
/PROC[name=$DUMMY$,lineno=2]={
   |-------- child statements --------
   |/EXEC[name=PS010,lineno=3]={
   |   |[pos=1,key=PGM]={STR,value=[IEBGENER]}
   |}
   |/DD[name=STEPLIB,lineno=4]={
   |   |[key=DSN]={STR,value=[SYS1.USERLIB]}
   |   |[key=DISP]={STR,value=[SHR]}
   |}
   |/DD[name=,lineno=5]={
   |   |[key=DSN]={STR,value=[SYS1.TEMPLIB]}
   |   |[key=DISP]={STR,value=[SHR]}
   |}
   |/DD[name=SYSPRINT,lineno=6]={
   |   |[key=SYSOUT]={STR,value=[*]}
   |}
   |/DD[name=SYSUT1,lineno=7]={
   |   |[pos=1]={STR,value=[DUMMY]}
   |}
   |/DD[name=SYSUT2,lineno=8]={
   |   |[pos=1]={STR,value=[DUMMY]}
   |}
}
/PEND[name=,lineno=8]={
}

2.2. JCL에서 SYSOUT으로 정의된 데이터셋

주로 JCL에 기술된 유틸리티나 애플리케이션에서 Output으로 사용된다. 현재 이 예제에서는 STEP01, STEP02에서 각각 IEBGENER의 메시지를 저장하는 SYSPRINT 문에 대하여 SPOOL 데이터셋이 생성되었다.

<STEP01/PS010 SYSPRINT oframe.TESTPROC.JOB00040.D000004>

 [2020-01-22T16:41:43.906976] [IEBGENER(2460)          ] [M] [IBG0001M] =====< IEBGENER START >=====
 [2020-01-22T16:41:43.911809] [IEBGENER(2460)          ] [M] [IBG0005M] RECORD COUNT = 10
 [2020-01-22T16:41:43.911817] [IEBGENER(2460)          ] [M] [IBG0006M] TOTAL RECORD COUNT = 10
 [2020-01-22T16:41:43.934682] [IEBGENER(2460)          ] [M] [IBG0002M] =====< IEBGENER FINISH >=====

<STEP02/PS010 SYSPRINT oframe.TESTPROC.JOB00040.D000009>

 [2020-01-22T16:41:44.490414] [IEBGENER(2467)          ] [M] [IBG0001M] =====< IEBGENER START >=====
 [2020-01-22T16:41:44.493186] [IEBGENER(2467)          ] [M] [IBG0005M] RECORD COUNT = 10
 [2020-01-22T16:41:44.493194] [IEBGENER(2467)          ] [M] [IBG0006M] TOTAL RECORD COUNT = 10
 [2020-01-22T16:41:44.509200] [IEBGENER(2467)          ] [M] [IBG0002M] =====< IEBGENER FINISH >=====

3. SPOOL BACKUP

JOBQ에서 필요없게 된 JOB을 삭제하게 되면, 해당 SPOOL도 삭제하게 된다. 만약 SPOOL을 보존해야 할 필요가 있으면 SPOOL BACKUP 기능을 사용하여 SPOOL을 백업할 수 있다.

SPOOL BACKUP 명령이 내려지면 OpenFrame 환경설정에 tjes 서브젝트, SPOOL 섹션의 SPOOL_BACKUP_DIR 키의 VALUE 항목에 설정된 백업 디렉터리에 현재 날짜로 디렉터리가 생성된다.

그리고 이 디렉터리에 백업된 JOB에 대해서 해당 SPOOL을 압축하여 JOBID_JOBNAME_submitDATE_submitTIME.tar.gz 형식의 파일을 생성한 후 백업된 JOB을 JOBQ와 SPOOL에서 삭제한다. 백업된 SPOOL에 대해서 조회하게 되면, OpenFrame 환경설정에 tjes 서브젝트, SPOOL 섹션의 SPOOL_UNPACK_DIR 키의 VALUE 항목에 설정된 디렉터리에 압축된 JOBID_JOBNAME_submitDATE_submitTIME.tar.gz 형식의 파일을 풀어 놓고, 이후 해당 JOB에 대한 SPOOL을 조회할 수 있다.

SPOOL BACKUP이 가능한 JOB 상태는 DONE, ERROR, STOP, FLUSH이다.

  1. SPOOL BACKUP된 내용은 추후에 항상 tjesmgr 명령어나 OpenFrame Manager[Batch] 메뉴에서 조회가 가능하다.

  2. SPOOL BACKUP 관련 명령은 TJESMGR 명령어를 참조한다.

  3. OpenFrame 환경설정에 tjes 서브젝트, SPOOL 섹션의 설정방법에 대한 자세한 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다.