自動化インプリメンテーション

A および B という 2 つの MVS システムがあるとします。これらのシステムで DASD は共用されません。システム A で作成された障害項目は、Fault Analyzer ISPF インターフェースを使用して表示/再分析のためにシステム B に自動的にコピーできます。

その項目はシステム A 上の通知ユーザー出口を使用してコピーされます。システム A では TSO バッチ・ジョブが実行され、障害項目がシステム B 上の専用ユーザー ID に PDS メンバーとして送信されます。システム B では、連続して実行されるバッチ TSO ジョブが障害項目を受信してステージング・データ・セットに入れます。次に IDIUTIL バッチ・ユーティリティーが呼び出されて、障害項目がローカル・ヒストリー・ファイルにインポートされます。

TSO XMIT/RECEIVE による障害項目インポート はこの概念を示します。
1. TSO XMIT/RECEIVE による障害項目インポート

TSO XMIT/RECEIVE を使用すれば、障害項目をインポートできます。システム A で異常終了が発生しました。その結果、障害項目がヒストリー・ファイルに書き込まれます。次に、通知ユーザー出口からバッチ・ジョブが実行依頼されます。 そのバッチ・ジョブは (TSO XMIT を使用して) その障害項目をシステム B に送信します。 システム B では、連続実行中のジョブが (TSO RECEIVE を使用して) その障害項目を受信し、ステージング・ヒストリー・ファイルに入れます。次に、このバッチ・ジョブは IDIUTIL を呼び出して、通常のシステム B ヒストリー・ファイルに新規障害項目をインポートします。このヒストリー・ファイルから、その障害項目を表示/再分析できます。

ユーザー出口全般については、ユーザー出口を使用した Fault Analyzer のカスタマイズを参照してください。具体的な通知ユーザー出口については、通知ユーザー出口を参照してください。IDIUTIL バッチ・ユーティリティーについては、ヒストリー・ファイルの管理 (IDIUTIL ユーティリティー)を参照してください。

NFYEXIT: サンプル通知ユーザー出口

NFYEXIT は、データ・セット IDI.SIDISAM1 内のメンバー IDISXNFY として、ソフトコピー・フォーマットで使用可能です。
2. バッチ TSO XMIT ジョブを実行依頼するサンプル通知ユーザー出口 (NFYEXIT)
nodeid   = 'MVSB'                        /* <--- verify/change */        ❶
userid   = 'IDIROBOT'                    /* <--- verify/change */        ❷
jobcard  = '//NOTIFY   JOB  MSGCLASS=Z'  /* <--- verify/change */        ❸
/*********************************************************************/  ❹
/* #Optionally, add checks here for selective transmission of fault  */
/* entries that only match a certain criteris.                       */
/* For example:                                                      */
/* If ENV.USER_ID ¬= "FRED" then exit 0                              */
/* If ENV.USER_IDIHIST ¬= "MY.HISTFILE" the exit 0                   */
/*********************************************************************/
"MAKEBUF"
queue jobcard
queue '//**************************************************************'
queue '//* Export fault entry'
queue '//**************************************************************'
queue "//EXPORT   EXEC PGM=IDIUTIL"
queue "//DD1      DD DISP=(,PASS),"
queue "//            SPACE=(CYL,(10,100,5),RLSE),"
queue "//            DCB=(DSORG=PO,RECFM=VB,LRECL=10000)"
queue "//SYSPRINT DD SYSOUT=*"
queue "//SYSIN    DD *"
queue "  EXPORT("ENV.IDIHIST"("ENV.FAULT_ID"),DD1)"
queue "/*"
queue '//**************************************************************'
queue '//* Terse the export data set'
queue '//**************************************************************'
queue "//TERSE    EXEC PGM=AMATERSE,PARM='PACK'"
queue "//SYSPRINT DD SYSOUT=*"
queue "//SYSUT1   DD DISP=SHR,DSN=*.EXPORT.DD1"
queue "//SYSUT2   DD DISP=(,PASS),"
queue "//            SPACE=(CYL,(10,100),RLSE)"
queue "//SYSPRINT DD SYSOUT=*"
queue '//**************************************************************'
queue '//* Perform TSO XMIT of the exported and tersed fault entry'
queue '//**************************************************************'
queue "//XMIT     EXEC PGM=IKJEFT01"
queue "//DD1      DD DISP=SHR,DSN=*.TERSE.SYSUT2"
queue "//SYSTSPRT DD SYSOUT=*"
queue "//SYSTSIN  DD *"
q_rec("  XMIT" nodeid"."userid "DDNAME(DD1) -")
q_rec("  NONOTIFY")
queue '/*'
/* 'Submit' the stacked TSO batch job */
n = queued()
"IDIALLOC DD(DD1) SYSOUT PGM(INTRDR)"
if rc = 0 then do /* allocation worked so generate output */
  address mvs "EXECIO" n "DISKW DD1 (FINIS"
  "IDIFREE DD(DD1)"
  say 'Fault entry' ENV.FAULT_ID 'sent to' nodeid'.'userid
end
else do                                                      
  "IDIWTO Allocation of INTRDR failed"                       
  say 'Fault entry' ENV.FAULT_ID 'job submission failure'   
end
exit 0

/* Pad record with blanks to 80 bytes.                               */
q_rec: procedure
parse arg rec
if (length(rec) < 80) then rec = rec||copies(' ',80-length(rec))
queue rec
return 0
注:
「nodeid」は障害項目の送信先のターゲット・システムを指定します。
「userid」は障害項目がターゲット・システムで受信されるユーザー ID を指定します。このユーザー ID は、障害項目の受信にのみ使用してください。
ジョブ・カードがローカル標準に準拠していることを確認します。
障害が別のシステムへの送信対象として適格であるかどうかを確認するために、ここでチェックを追加できます。例では、ユーザー ID やヒストリー・ファイル名をどのように使用できるのかを示していますが、ENV データ域や NFY データ域にあるすべてのフィールドをチェックすることが可能です。
システム A で発生するすべての障害に対して、バッチ TSO XMIT ジョブを実行依頼するサンプル通知ユーザー出口 (NFYEXIT) の出口を呼び出すことができます。この出口を活用するには、次のオプションを IDICNFxx 構成メンバーに追加します (exec.lib は REXX EXEC PDS または PDSE データ・セットです)。
DataSets(IDIEXEC(exec.lib))
Exits(NOTIFY(REXX(NFYEXIT)))

IDIROBOT: 障害項目を受信するためのサンプル REXX EXEC

IDIROBOT は、データ・セット IDI.SIDISAM1 内のメンバー IDISROBT として、ソフトコピー・フォーマットで使用可能です。この exec は以下のアクションを行います。
  1. IDIROBOT ユーザー用のファイルを受信し、ステージング・データ・セットに含めます。このデータ・セットから、IDIUTIL バッチ・ユーティリティーを使用してローカル・ヒストリー・ファイルにインポートされます。
  2. IDIUTIL IMPORT ユーザー出口、IDIROBEX を作成します (REXX IDIUTILユーザー出口の例を参照)。
3. TSO 受信 REXX exec (IDIROBOT) の例、パート 1
histfile = 'B.HIST'              /* <--- verify/change */ ❺
temphist = 'B.TEMP'              /* <--- verify/change */ ❻
seconds  = '60'                  /* <--- verify/change */ ❼
use_exit = 'Y'                   /* <--- Y|N. verify/change */  ❽
address tso
x = prompt('on')
x = outtrap('var.',10,'noconcat')
do forever
  /* Obtain information about transmitted data on the JES output queue */
  if queued() = 0 then queue 'end'
  'receive'
  input = 'N'

  /* Examine the output from the 'dummy' receive command.
     The following variables are initialized:
       dsn     - the 'sending' history file name
       fromid  - the user ID performing the TSO XMIT
       node    - the JES node from which the fault entry was sent
       faultid - the fault ID (member name) */
  do i = 1 to var.0
    parse var var.i msgno t1 t2 t3 t4 t5 t6
    if msgno = 'INMR901I' then do
      dsn = t2
      fromid = t4
      node = t6
    end
    else if msgno = 'INMR902I' then do
      faultid = t2
      input = 'Y'
      leave
    end
  end
4. TSO 受信 REXX exec (IDIROBOT) の例、パート 2
  /* Perform actual receive to the staging history file followed by an
     IDIUTIL batch utility import if there is data available */
  if input = 'Y' then do
    if faultid <> "" then do
      /* Receiving a PDS/E.                                          */

      say 'Receiving' dsn'('faultid') from' node'.'fromid
      queue "DSN('"temphist"')"
      queue 'END'
      'RECEIVE'
    end
    else do
      /* Receiving a sequential data set - assume AMATERSE PACKed.   */
      say 'Receiving' dsn 'from' node'.'fromid
      queue "DSN('"temprecv"')"
      queue 'END'
      'RECEIVE'

      /* Perform AMATERSE UNPACK.                                    */
      "ALLOC DD(SYSPRINT) DUMMY"
      "ALLOC DD(SYSUT1) DA('"temprecv"') SHR"
      "ALLOC DD(SYSUT2) DSN('"temphist"'),
             NEW CATALOG UNIT(SYSALLDA) RECFM(V B) LRECL(10000),
             CYLINDERS SPACE(10,100) DIR(5)"
      address tso "CALL *(AMATERSE) 'UNPACK'"
      say 'UNPACK rc =' RC

      /* Get fault ID (member name).                                 */
      "LISTDS '"temphist"' MEMBERS"
      /* Sample output:                                              */
      /* FRED.$$TEMP$$.HIST                                          */
      /* --RECFM-LRECL-BLKSIZE-DSORG                                 */
      /*   VB    10000 27998   PO                                    */
      /* --VOLUMES--                                                 */
      /*   E$US21                                                    */
      /* --MEMBERS--                                                 */
      /*   F01103                                                    */
      mbr_start = 0
      do i = 1 to var.0
        /*say "var."i"='"var.i"'"*/
        if mbr_start = 0 then do
          if strip(var.i) = "--MEMBERS--" then do
            mbr_start = i + 1
            leave
          end
        end
      end
      if mbr_start = var.0 then do
        /* One, and only one, member.                                */
        faultid = strip(var.mbr_start)
      end
      else do
        say 'ERROR: More than one member found in data set' temphist,
            '- terminating'
        exit 12
      end
      'FREE DD(SYSUT2)'
      'FREE DD(SYSUT1)'
      'FREE DD(SYSPRINT)'

      "DELETE '"temprecv"'"
    end
5. TSO 受信 REXX exec (IDIROBOT) の例、パート 3

    /* The target history file in the 'histfile' variable could be   */
    /* determined here based on any of the initialized variables     */
    /* dsn, fromid, node or faultid.  This sample EXEC uses a single */
    /* history file only.                                            */ ❾

    /* Perform IDIUTIL IMPORT.                                       */
    'ALLOC DD(SYSIN) NEW REU UNIT(VIO) RECFM(F B) LRECL(80)'
    "ALLOC DD(SYSPRINT) SYSOUT"
    if use_exit = 'Y' then                                 
      parms.1  = "EXITS(IMPORT(REXX(IDIROBEX)))"           
    else                                                   
      parms.1  = "* Using IDIOPTLM for dump data set names"
    parms.2  = "IMPORT("histfile","
    parms.3  = "  "temphist"("faultid"),PACKAGE)"
    parms.0  = 3
    "EXECIO * DISKW SYSIN (STEM parms. FINIS"
    address tso "CALL *(IDIUTIL)"
    say 'IMPORT rc =' RC
  end
  else do
    /* Sleep for 60 seconds before attempting to receive again */
    address tso "call *(idisleep) '"seconds"'"
  end
end
注:
この項目は、受信された障害項目が組み込まれるターゲット・ヒストリー・ファイルの名前です。障害が最初に発生した場所に基づくヒストリー・ファイルを選択するには、❾ を参照してください。
この項目は、TSO 受信コマンドに使用されるステージング・データ・セットルです。このデータ・セットから障害項目がターゲット・ヒストリー・ファイルにインポートされます。
重要: 事前割り振りデータ・セットは使用しないでください。例に示したように、exec により、受信した各障害に対するこのステージング・データ・セットを割り振りおよび削除します。

IDIROBOT exec および IDIUTIL IMPORT 処理が動作する場合、ステージング・データ・セットは通常のヒストリー・ファイルとして使用されることや、複数のメンバーを含むことはできません。通常のヒストリー・ファイルとして使用される場合 (例えば、「障害項目リスト」画面を使用して表示される場合や、IDIUTIL FILES または LISTHF 制御ステートメントのターゲットとして使用される場合)、$$INDEX メンバーが作成される可能性があり、それにより処理が動作しなくなります。また、データ・セットが管理対象の IDIS サブシステムになる可能性があり、それにより後でシリアライズの問題が発生する可能性があります。

ステージング・データ・セットが受信および IMPORT 処理の間でのみ存在するようにすることで、これらの問題が発生する可能性が排除されます。

IDIROBOT exec は、WAIT 状態に入って、受信される障害項目のチェック間でリソースを保持します。障害項目の受信相互間の時間間隔 (秒数) をここに指定できます。選択されたユーザー ID の JES 出力キュー上の障害項目がすべて受信され、IDIROBOT exec が WAIT に移行します。
  • RFRDSN、XDUMPDSN および SDUMPDSN オプションが IDIOPTLM 構成オプション・ロード・モジュールで有効なデータ・セット名のパターンに設定された場合、IDIROBEX ユーザー出口を使用する必要はありません。(Fault Analyzer 構成オプション・モジュールを使用した IDIOPTLM のカスタマイズ を参照)。この場合、「use_exit」は「N」に設定します。
  • IDIROBEX ユーザー出口を使用する場合、出口により提供されるダンプ・データ・セット名は IDIOPTLM の同等のオプション設定を上書きします。
このサンプル exec では、受信されるすべての障害項目に対して 1 つのターゲット・ヒストリー・ファイルのみが使用されます。以下のいずれかの項目に基づくターゲット・ヒストリー・ファイルを割り当てることができます。
  • 元のヒストリー・ファイル名 (変数「dsn」)。
  • 送信ユーザー ID (変数「fromid」)。
  • 送信元のノード ID (変数「node」)。
  • 障害 ID 自体 (変数「faultid」)。
IDIROBOT exec (IDISTSOB) を実行する TSO バッチ・ジョブの例IDIROBOT exec を実行するバッチ TSO ジョブの例を示します。これは、データ・セット IDI.SIDISAM1 内のメンバー IDISTSOB として、ソフトコピー・フォーマットで使用可能です。
6. IDIROBOT exec (IDISTSOB) を実行する TSO バッチ・ジョブの例
//IDISTSOB JOB  <job card parameters>                                
// SET EXECDSN=exec.lib                           <--- verify/change 
//TSOBATCH EXEC PGM=IKJEFT01                                         
//SYSEXEC  DD   DISP=SHR,DSN=&EXECDSN.                               
//SYSPRINT DD   SYSOUT=*                                             
//SYSTSPRT DD   SYSOUT=*                                             
//SYSIN    DD   DUMMY                                                
//SYSTSIN  DD   *                                                    
  IDIROBOT                                                           
/*                                                                   
//IDIEXEC  DD DISP=SHR,DSN=*.TSOBATCH.SYSEXEC                        
//IDITRACE DD SYSOUT=* 
重要: IDIROBOT exec が実行されているユーザー ID (この例では、IDISTSOB ジョブの実行依頼者) に、ステージング・データ・セット、およびインポート用のターゲットとして使用されるすべてのヒストリー・ファイルの両方への更新アクセス権があることを確認します。

IDIROBOT exec は終了しないため、IDISTSOB ジョブは無期限に実行されます。ただし、不必要なリソースを使用しないように、この exec により、ジョブが着信データの受信試行間で WAIT 状態に入ります。ジョブを終了するには、非アクティブ期間に MVS CANCEL コマンドを使用してください。または、選択されたユーザー ID に送信されると出口を終了させる特定のファイルを、exec に認識させることもできます。

JES イニシエーターを起動しないようにするために、この JCL を実行するための開始済みタスクを代わりに定義できます。