スプール

本章では、スプール・データセットとスプールのバックアップについて説明します。

1. 概要

スプールとは、ジョブの実行に必要な入力やジョブの実行によって作成された結果であるスプール・データセットが含まれているボリュームまたはスプール・データセットを使用するオペレーションを意味します。

JCLがサブミットされると、TJESではジョブに一意のJBOIDを割り当てて、JOBQに登録します。その際、割り当てられたJBOIDの名前でスプール・ボリュームにスプール・スペースが割り当てられます。その後、INPJCLというスプール・データセットが作成され、JCLをINPJCLにコピーします。また、INPJCLとマクロを結合してEXPJCLを作成します。以降のジョブの実行では、INPJCLが入力として使用されます。

tjclrunは、JBOIDで作成されたスプール・スペースにJESMSG、JESJCL、SYSMSGという名前のスプール・データセットと、JCLのSYSOUT(SOUT) FDに対するスプール・データセットを作成し、ジョブの実行に使用します。

作成されたスプール・データセットは、tjesmgrまたはOpenFrame Managerを使用して確認できます。

2. スプール・データセット

スプール・データセットは、ジョブが実行される際にデフォルトで作成されるデータセット(INPJCL、EXPJCL、JESMSG、JESJCL、SYSMSG)と、JCLにSOUTとして記述されて作成されるデータセットがあります。

以下は、SOUT.DATA.INデータセットのレコードをソートし、SOUT.DATA.OUTを作成するJCLの例です。

<SORT01 JCL>

¥ JOBG USERGRP
¥ JOB SORT01,LIST=(L,JD)
¥ EX SORT
¥ FD LIST=DA,SOUT=L
¥ FD SORTWK01=DA,TRK=21
¥ FD SORTWK02=DA,TRK=21
¥ FD SORTWK03=DA,TRK=21
¥ FD SORTIN=DA,FILE=SORT.DATA.IN
¥ FD SORTOUT=DA,FILE=SORT.DATA.OUT
¥ FD COIN=*
 SORT    FIELDS=(1,6,CH,A)
¥*
¥ JEND
¥ JGEND

JCL SORT01をサブミットして実行すると、以下のスプール・データセットが作成されます。

SPOOL LIST:
---------------------------------------------------------------------------
NO  STEP              DDNAME       SIZE  DSNAME
---------------------------------------------------------------------------
0   --------          INPJCL         271 INPJCL
1   --------          SYSMSG          4K SYSMSG
2   --------          EXPJCL         271 EXPJCL
3   --------          JESMSG          1K JESMSG
4   --------          JESJCL          9K JESJCL
5                     LIST            1K ROOT.SORT01.JOB00006.D000000

2.1. デフォルトで作成されるスプール・データセット

2.1.1. INPJCL

サブミットされたJCLがコピーされています。

<INPJCL>

¥ JOBG USERGRP
¥ JOB SORT01,LIST=(L,JD)
¥ EX SORT
¥ FD LIST=DA,SOUT=L
¥ FD SORTWK01=DA,TRK=21
¥ FD SORTWK02=DA,TRK=21
¥ FD SORTWK03=DA,TRK=21
¥ FD SORTIN=DA,FILE=SORT.DATA.IN
¥ FD SORTOUT=DA,FILE=(SORT.DATA.OUT,AD)
¥ FD COIN=*
 SORT    FIELDS=(1,6,CH,A)
¥*
¥ JEND
¥ JGEND

2.1.2. EXPJCL

サブミットされたJCLでマクロ処理を行ったJCLがコピーされています。以降のジョブ実行ではEXPJCLの内容を使用します。

<EXPJCL>

¥ JOBG USERGRP
¥ JOB SORT01,LIST=(L,JD)
¥ EX SORT
¥ FD LIST=DA,SOUT=L
¥ FD SORTWK01=DA,TRK=21
¥ FD SORTWK02=DA,TRK=21
¥ FD SORTWK03=DA,TRK=21
¥ FD SORTIN=DA,FILE=SORT.DATA.IN
¥ FD SORTOUT=DA,FILE=(SORT.DATA.OUT,AD)
¥ FD COIN=*
 SORT    FIELDS=(1,6,CH,A)
¥*
¥ JEND
¥ JGEND

2.1.3. JESMSG

ジョブに関連する情報と各ステップの情報が保存されます。

---< JOB INFO >------------------------------------------------------------
 JOB  ID    : JOB00032      NODE NAME  : NODE1
 JOBG NAME  : USERGRP       JOB  NAME  : SORT01
 JOB  CLASS : A , JOB STATUS : D(R00010) , JOB PRTY : 0 , RUNNER INDEX : 0
 JOB  USER  : ROOT
 JCL  PATH  : /home/obmxsp/oframe_new/volume_default/SYS1.JCLLIB/TEST
 TIME STAMP : SUBM 20120723110515, EXEC 20140723110516, TERM 20140723110518
 RES  USAGE : CPU - 0s (p:2s) , 0%
---<STEP INFO>-------------------------------------------------------------
 STEP : [       1]
  CPU      0s(p: 5s).
  LIST     JOB00006(ROOT.SORT01.JOB00006.D000000)            R:0       W:38
  SORTWK01 SYS08175.T234027.RA000.SORT01.R010001             R:0       W:0
  SORTWK02 SYS08175.T234027.RA000.SORT01.R010002             R:0       W:0
  SORTWK03 SYS08175.T234027.RA000.SORT01.R010003             R:0       W:0
  SORTIN   SORT.DATA.IN                                      R:10      W:0
  SORTOUT  SORT.DATA.OUT                                     R:0       W:10
  COIN     JOB00006(ROOT.SORT01.JOB00006.D000006)            R:1       W:0
  • ジョブ情報

    以下は、JESMSGに保存されるジョブ情報です。

    フィールド 説明

    JOB ID

    割り当てられたジョブの一意の番号です。

    JOBG NAME

    ジョブ・グループ名です。

    JOB NAME

    ジョブ名です。

    NODENAME

    ジョブが実行されたTJESのノード名です。

    JOB CLASS

    ジョブ・クラスです。

    JOB STATUS

    現在のジョブの状態(戻り値)です。

    JOB PRTY

    実行したジョブのジョブ・スケジューリングの優先順位です。

    RUNNER INDEX

    ジョブを実行したランナー・スロット番号です。

    JOB USER

    ジョブを実行したユーザーです。

    JCL PATH

    ユーザーがサブミットしたJCLファイルの位置とファイル名です。

    TIME STAMP

    ジョブがサブミットされた時刻とジョブ実行の開始および終了時刻です。

    RES USAGE

    ジョブの実行に使用されたCPU時間です。

    • CPU

    • 0s : tjclrunおよびフォークされたプロセスのCPUの総使用量(現在はプロセスが終了されたのでゼロ)

    • (p:2s) : tjclrunがフォークされた時点から終了されるまでの時間(ジョブの実行時間)

    • 0% : ジョブの実行時間比のCPU使用率

  • ステップ情報

    以下は、JESMSGに保存されるステップ情報です。

    フィールド 説明

    STEP

    ジョブ・ステップ名です。名前が指定されていないステップの場合は、ステップ番号を出力します。

    CPU

    ジョブ・ステップ処理に使用されたCPU時間です。(CPU時間: 実際の処理時間)

    LIST

    ジョブ・ステップで発生したLISTの入出力カウントです。

    SORTWK01

    ジョブ・ステップで発生したSORTWK01の入出力カウントです。

    SORTWK02

    ジョブ・ステップで発生したSORTWK02の入出力カウントです。

    SORTWK03

    ジョブ・ステップで発生したSORTWK03の入出力カウントです。

    SORTIN

    ジョブ・ステップで発生したSORTINの入出力カウントです。

    SORTOUT

    ジョブ・ステップで発生したSORTOUTの入出力カウントです。

    COIN

    ジョブ・ステップで発生したCOINの入出力カウントです。

2.1.4. JESJCL

INPJCLに対してJCL文のパース・ツリー(parse tree)が保存されます。

<JESJCL>

 ========================================================================
 ¥ JOBG[name=]={
    |lineno=1
    |param[position=1]={
    |   |type=VAL_STR
    |   |value=[USERGRP]
    |}
    |---------- child statements ----------
    |¥ JOB[name=]={
    |   |lineno=2
    |   |param[position=1]={
    |   |   |type=VAL_STR
    |   |   |value=[SORT01]
    |   |}
    |   |param[keyword=LIST]={
    |   |   |type=VAL_SUBPARAMS
    |   |   |value={
    |   |   |   |param[position=1]={
    |   |   |   |   |type=VAL_STR
    |   |   |   |   |value=[L]
    |   |   |   |}
    |   |   |   |param[position=2]={
    |   |   |   |   |type=VAL_STR
    |   |   |   |   |value=[JD]
    |   |   |   |}
    |   |   |}
    |   |}
    |   |---------- child statements ----------
    |   |¥ EX[name=]={
    |   |   |lineno=3
    |   |   |param[position=1]={
    |   |   |   |type=VAL_STR
    |   |   |   |value=[SORT]
    |   |   |}
    |   |}
    |   |¥ FD[name=]={
    |   |   |lineno=4
    |   |   |param[keyword=LIST]={
    |   |   |   |type=VAL_STR
    |   |   |   |value=[DA]
    |   |   |}
    |   |   |param[keyword=SOUT]={
    |   |   |   |type=VAL_STR
    |   |   |   |value=[L]
    |   |   |}
..

2.1.5. SYSMSG

ジョブの実行中にtjclrunが作成したメッセージを保存します。

<SYSMSG>

 JOBID=JOB00032   JOBPOS=0   RUNPID=30176
 SORT01 JOB
 ----------------------------------  EX step ----------------------------------
 (JRN2258I) COIN     FD SHUNT - FILENAME=JOB00032(ROOT.SORT01.JOB00032.D000006)
 (JRN2905I) Now allocate(JOB00032) step: fd:SYSPRINT
 (JRN2910I) LIST FD ALLOCATED - FILENAME=JOB00032(ROOT.SORT01.JOB00032.D000000)
 (JRN2905I) Now allocate(SYS12205.T110516.RA000.SORT01.R010001) step: fd:SORTWK01
 (JRN2909I) SORTWK01 FD ALLOCATED - FILENAME=SYS12205.T110516.RA000.SORT01.R010001
 (JRN2905I) Now allocate(SYS12205.T110516.RA000.SORT01.R010002) step: fd:SORTWK02
 (JRN2909I) SORTWK02 FD ALLOCATED - FILENAME=SYS12205.T110516.RA000.SORT01.R010002
 (JRN2905I) Now allocate(SYS12205.T110516.RA000.SORT01.R010003) step: fd:SORTWK03
 (JRN2909I) SORTWK03 FD ALLOCATED - FILENAME=SYS12205.T110516.RA000.SORT01.R010003
 (JRN2905I) Now allocate(SORT.DATA.IN) step: fd:SORTIN
 (JRN2909I) SORTIN   FD ALLOCATED - FILENAME=SORT.DATA.IN
 (JRN2905I) Now allocate(SORT.DATA.OUT) step: fd:SORTOUT
 (JRN2909I) SORTOUT  FD ALLOCATED - FILENAME=SORT.DATA.OUT
 (JRN2905I) Now allocate(JOB00032) step: fd:COIN
 (JRN2910I) COIN     FD ALLOCATED - FILENAME=JOB00032(ROOT.SORT01.JOB00032.D000006)
 (JRN2012I) SYSOUT open LIST  ok
 (JRN2011I) SYSIN open COIN ok
 (JRN2335I) SORTOUT FD in  exported
 (JRN2335I) SORTIN FD in  exported
 (JRN2335I) SORTWK03 FD in  exported
 (JRN2335I) SORTWK02 FD in  exported
 (JRN2335I) SORTWK01 FD in  exported
 (JRN0056I) coprocess child: argv[0]=SORT
 (JRN0058I) pgm pid=30184
 (JRN0060I) Entering exec_pipe_loop() ...
 (JRN2010I) SYSIN write ok
 (JRN2011I) child program is SORT ok
 (JRN0245I) PGM closed stdout pipe
 (JRN0061I) Leaving exec_pipe_loop() ...
 (JRN0063I) pipe work done with coprocess child (PGM)
 (JRN0080I) PGM pid[30184] EXITED
 (JRN0065I)  EXEC PGM step done with RC=10
 (JRN2012I) LIST FD disposed - NORMAL ok
 (JRN2012I) SORTWK01 FD disposed - NORMAL ok
 (JRN2012I) SORTWK02 FD disposed - NORMAL ok
 (JRN2012I) SORTWK03 FD disposed - NORMAL ok
 (JRN2012I) SORTIN FD disposed - NORMAL ok
 (JRN2012I) SORTOUT FD disposed - NORMAL ok
 (JRN2012I) COIN FD disposed - NORMAL ok
 ------------------------------ DATA SET DISPOSE ------------------------------
 --------------------------- DATA SET UNALLOCATION ----------------------------
 (JRN2012I) COIN FD unallocated - NORMAL ok
 (JRN2012I) SORTOUT FD unallocated - NORMAL ok
 (JRN2012I) SORTIN FD unallocated - NORMAL ok
 (JRN2012I) SORTWK03 FD unallocated - NORMAL ok
 (JRN2012I) SORTWK02 FD unallocated - NORMAL ok
 (JRN2012I) SORTWK01 FD unallocated - NORMAL ok
 (JRN2012I) LIST FD unallocated - NORMAL ok
 (JRN0333I) JOB is enqueued for output processing - JOBID=JOB00032, ABEND=0

2.2. JCLでSYSOUTに定義されているスプール・データセット

主にJCLに記述されているユーティリティやアプリケーションでアウトプットとして使用されます。この例では、SORTユーティリティが実行中に発生したメッセージを保存するLIST文に対してスプール・データセットが作成されています。

< SYSPRINT ROOT.SORT01.JOB00032.D000000>

 dfsort version 7.3.0(0) tmaxsoft@openframe:ofsrc73/batch(#1) 2012-04-17 09:57:32
 110517 M SRT0001M parsing starts.
 110517 M SRT0002M parsing finishes.

 <<PROSORT SCRIPT>>

 DEFREC FIXED,SIZE=80
 DATASIZE 1M
 MEMORY 512M
 WORKSPACE = (
              /home/tmaxsoft/openframe/temp)
 SORT FIELDS=(1,6,CH,A)


 110517 U MSGXXXXU 0 records are released
 110517 U MSGXXXXU 0 records are returned
 110517 M SRT3002M sorting  finishes.
 110517 M SRT9002M 0 records are written.

3. スプール・バックアップ

JOBQから不要になったジョブを削除すると、対応するスプールも削除されます。スプールを保存する必要がある場合は、スプールのバックアップ機能を使用します。

SPOOL BACKUPコマンドを実行すると、OpenFrame環境設定のtjesサブジェクトのSPOOLセクションのSPOOL_BACKUP_DIRキーのVALUE項目に設定されたバックアップ・ディレクトリに現在の日付でディレクトリが作成されます。

また、このディレクトリにバックアップされたジョブに対し、対応するスプールを圧縮してJOBID_JOBNAME_submitDATE_submitTIME.tar.gz形式のファイルを作成した後、JOBQとスプールからバックアップされたジョブを削除します。OpenFrame環境設定のtjesサブジェクトのSPOOLセクションのSPOOL_UNPACK_DIRキーのVALUE項目に設定されたディレクトリに圧縮されたJOBID_JOBNAME_submitDATE_submitTIME.tar.gzファイルを解凍し、バックアップされたスプールを確認することができます。

スプールのバックアップが可能なジョブの状態は、DONE、ERROR、STOP、FLUSHです。

  1. バックアップされたスプールは、tjesmgrコマンドまたはOpenFrame Manager[Batch]メニューから確認できます。

  2. スプールのバックアップ・コマンドは、 TJESMGRコマンドを参照してください。

  3. OpenFrame環境設定のtjesサブジェクトのSPOOLセクションの設定方法については、OpenFrame Batch『環境設定ガイド』を参照してください。