SYSLOG

By kamii - Last updated: 金曜日, 6月 18, 2010

SYSLOG:System LOG、システム・ログ

システム・ログは、MVS上でのシステムの活動状況や、すべてのジョブからのコンソール・メッセージなどが時系列に記録される、JES2スプール内のSYSOUTデータセットでシスログ(SYSLOG)と呼ばれます。
コンソールに出力される様々なメッセージのうち、センターによって不要と扱われるメッセージなどはコンソールへの出力が抑止されるようなカスタマイズも行われていますが、システム・ログにはすべて記録されます。マスター・スケジューラーは、JES2と連係してシスログを処理します。

システム・ログには、MVS上でのシステムの活動状況が時系列に記録されているため、障害発生時の重要な問題識別の資料となります。特に、他のジョブからの要求を受けてサービスを提供するサーバー・プログラムや、他のジョブやサブシステム等にサービスを要求したり連係して動作したりするようなプログラムでは、障害となったジョブ以外のジョブやOSから関連するメッセージなどが出されている場合もあります。すべてのジョブからのメッセージが記録されているシステム・ログは有効な調査用資料となります。


システム・ログの出力

SYSLOGは、OSコマンドW(WRITELOG)によって出力することができます。

「W L」と入力すれば、IPL以降または前回のWRITELOGコマンド投入からその時点までのSYSLOGを、LクラスのSYSOUTとして印刷またはライター出力することができます。クラスを省略すれば、センターで指定したデフォルト・クラスが使われます。SYSLOGを保管する場合は、XWTRで、DASDあるいはTAPEに順データセットとしてコピーすることができます。


システム・ログの参照

SDSFには、SYSLOGの参照機能(LOG)があります(管理者またはオペレーター権限が必要)。これを利用すれば、WRITELOGコマンドを使わなくても、スプール内のSYSLOGデータセットを直接参照できます。ジョブ出力のSYSOUTと同様に、特定の文字列を検索したり、内容をデータセットにコピーしたりできます。
MSPではECS、VOS3ではSYSLOG2を利用すれば、SYSLOGを参照できます。

MVSではPTコマンドをによってSYSLOGを簡単な操作で任意のデータセットにコピーすることができます。コピーする範囲を「開始時刻 開始日付 終了時刻 終了日付」で指定することもできます。


システム・ログのフォーマット(MVS)


システム・ログのフォーマット(MSP,VOS3)

Filed in キーワードから(何が知りたいですか)

KBKARCS

By kamii - Last updated: 木曜日, 6月 17, 2010

ARCS(ARChives Service program):富士通OSにおけるDASDボリューム・ユーティリティー

ARCSは富士通のメインフレーム用ソフトウェアで、DASDボリューム上のデータの退避、復元、複写、移行を行うユーティリティーです。KBKARCSはそのプログラム名です。マニュアル「ARCS使用手引書」に詳細が記載されています。MSPおよびXSPで利用できます。

Filed in キーワードから(何が知りたいですか)

IEHLIST

By kamii - Last updated: 木曜日, 6月 17, 2010

IEHLIST:DASDボリューム、区分データセットのリスティング・ユーティリティー

IEHLISTは(z/OS)における、DASDボリュームまたは区分データセット・ディレクトリーのリスティングを行うユーティリティー・プログラムの名前です。MSPではJSGLIST、VOS3ではJSFLISTとして提供されています。プログラム名は異なるものの、JCLもSYSIN制御ステートメントも含め、基本的に互換ユーティリティーです。

DASDボリュームのVTOCや区分データセットのディレクトリーのリストアップを行うことはよくあります。ボリューム内にどのようなデータセットがあるのか?、データセット内にどのようなメンバーがあるのか?を調べることは運用や開発の現場でしばしば起こります。

ユーティリティーの実行サンプルはこちらをご覧下さい。

IEHLISTは古くからあるユーティリティーで、基本ユーティリティーの1つでもありますが、リストの見やすさという点では今ひとつです。z/OSであれば、VTOCやディレクトリーの各フィールドを詳細に見る必要がないのであれば、VTOCリストやメンバーリストなどはISPFをバッチで呼び出す方がより見やすいリストを得ることができます。

//         JOB (acct),name,CLASS=A,MSGCLASS=B,REGION=4M
//*********************************************************************
//*        ISPF BACTH SESSION SAMPLE JCL
//*********************************************************************
//ISPBATCH PROC
//BLDCLST  EXEC PGM=IEBGENER
//SYSPRINT DD DUMMY
//SYSUT2   DD DISP=(,PASS),DSN=&&CLIST(ISPFCMD),
//            UNIT=VIO,SPACE=(TRK,(1,1,1)),
//            DCB=(RECFM=FB,BLKSIZE=0,LRECL=80)
//SYSIN    DD DUMMY
//*
//ISPFRUN  EXEC PGM=IKJEFT01,DYNAMNBR=256
//SYSPROC  DD DISP=(OLD,DELETE),DSN=&&CLIST
//ISPPROF  DD UNIT=SYSDA,SPACE=(TRK,(15,1,10)),
//            DCB=(RECFM=FB,BLKSIZE=6160,LRECL=80)
//ISPLLIB  DD DISP=SHR,DSN=ISP.SISPLOAD
//ISPPLIB  DD DISP=SHR,DSN=ISP.SISPPENU
//ISPMLIB  DD DISP=SHR,DSN=ISP.SISPMENU
//ISPTLIB  DD DISP=SHR,DSN=ISP.SISPTENU
//ISPSLIB  DD DISP=SHR,DSN=ISP.SISPSLIB
//         DD DISP=SHR,DSN=ISP.SISPSENU
//SYSTSPRT DD SYSOUT=*
//*
//PRTLIST  EXEC PGM=IEBGENER,COND=(0,NE,ISPFRUN)
//SYSPRINT DD DUMMY
//SYSUT1   DD DISP=(OLD,DELETE),DSN=ISPFJOB.&SYSUID..SPF1.LIST
//ISPLOG   DD DISP=(OLD,DELETE),DSN=ISPFJOB.&SYSUID..SPFLOG1.LIST
//SYSUT2   DD SYSOUT=*
//SYSIN    DD DUMMY
//         PEND
//*********************************************************************
//IEFPROC  EXEC ISPBATCH
//BLDCLST.SYSUT1 DD *,DLM='++'
/* CLIST FOR ISPF BATCH SESSION */
/* PRINT VTOC LIST */    代わりにLEVEL(UAP1)とDS名レベルを指定してもよい
ISPEXEC LMDINIT LISTID(LID)  VOLUME(WRKVOL)
ISPEXEC LMDLIST LISTID(&LID) OPTION(SAVE) STATS(YES)
ISPEXEC LMDFREE LISTID(&LID)
END
//ISPFRUN.SYSTSIN DD *
  PROFILE PREFIX(ISPFJOB)           /* AVOID ISPF-LOG ENQ CONTENTION */
  ISPSTART CMD(%ISPFCMD)            /* ISPF EXECUTION COMMANDS CLIST */
//
//

ISPFのLMサービスによるVTOCリストの出力サンプルです。LMサービスでの出力であれば、PDFの3.4ユーティリティーに近い形のリスト出力を得ることができます。
PDSのメンバーリストであれば次のようなCLISTをBLDCLST.SYSUT1 DD文に記述すればで出力できます。

//BLDCLST.SYSUT1 DD *,DLM='++'
/* PRINT PDS MEMBER LIST */
ISPEXEC LMINIT  DATAID(DDVAR) DATASET('USR1.LINKLIB') ENQ(SHR)
ISPEXEC LMPRINT DATAID(&DDVAR) INDEX
END

ISPFバッチはこちらにものサンプルがあります。

Filed in キーワードから(何が知りたいですか)

RACFユーザー登録

By kamii - Last updated: 木曜日, 6月 17, 2010

RACFに新しいユーザーを登録するには、RACFコマンドを使用します。RACFコマンドはTSOにて発行でき、バッチセッションでも使用できます。

RACFに新しいユーザーを登録する

RACFに一般リソースとしてTSOアカウント名とログオン・プロシージャー名を登録する



RACFに新しいユーザーを登録するが、TSOアカウントはACCOUNTコマンドで登録する

当然ながらADDUSERやACCOUNTコマンドは権限のあるユーザーでなければ使用できません。

Filed in ありがたいサンプルJCL

CICS概説

By takao - Last updated: 火曜日, 6月 15, 2010

トランザクション処理

CICSとは、Customer Information Control Systemの略で、IBMのソフトウェアプロダクトとして売られています。
もともとは、ガス会社が「顧客管理」のために作ったオンラインコントロールプログラムでした。なぜ、「オンラインコントロール」が必要なのでしょうか?
まず、オンライン処理、すなわちトランザクション処理の考え方について説明しておきます。
端末から最初にメッセージが送られてきます。汎用機前提の話しですから、いろいろ考えられます。「売上げを見たい」「人事管理」「お客ごとの状況を見たい」さまざまあるでしょう。このメッセージについて、どこから来たメッセージか(誰からか)?どのプログラムで処理をすればいいのか?が自動的に決定され、予定されているプログラムで処理をし、出力メッセージを端末に向かって返したらトランザクション処理はひとつ完了です。
ウェブアプリケーションに例えると、URLに相当するものはあらかじめサーバーでもっており、さらにウェブサーバーとTCP/IPとCGIが行う処理をひとまとめで面倒をみていることになります。
そのかわり、あらかじめ個々の端末の属性を事前定義してありますから、ディスプレイ、プリンターといった装置に応じた処理が可能です。

CICSはIBMのイギリス ハーズレー研究所で開発されており、オンライン処理における先進的な取り組みを続けました。後に説明するプログラムコントロールの簡便さと相まって、多くのオンラインシステムのインフラとして使われています。

CICSとアプリケーションプログラム

CICSは EXEC CICSで始まる呼び出し(API)で処理が始まります。サポートしているプログラム言語はCOBOL,C,C++,Java,PL/I, RPG,にS/390アセンブラーさらに、High Performance Java(HPJ)と多彩です。
とはいえ、CICSで使われているプログラム言語は、IBM COBOL, Merant(旧MicroFocus) COBOLが圧倒的に多いと思われます。

CICSはIMSとは異なり、すべてのアプリケーションとCICSサービスは「問題プログラム」状態で、ひとつの仮想空間で稼働します。(MROについては触れません)つまりコントローラ自身も同じアドレス空間で動いています。このアーキテクチャはパフォーマンスの面では優れているのですが、怪しい挙動のアプリケーションにはかなり無防備です。IMSとの比較でよくいわれることです。

CICS構成要素

CICSは、ターミナルコントロール、タスクコントロール、プログラムコントロール、ストレージコントロールとファイルコントロールから構成されています。
各々、図のようにTCT,PCT,PPT,FCTというコントロールテーブルをもっています。COMMAREAはセッションの間存在するデータ用のサービスです。あるトランザクションの状況を次のトランザクションに伝えることができます。また、I/O処理にも使われます。


次に各コントロール機能について概略を説明します。

ターミナルコントロール

CICSはもともと、SNAベースで作られました。すべてのメッセージの送受信はVTAM経由です。メッセージが送られてくると、Terminal Control Table(TCT)内のターミナルIDを見て、どのターミナルとのやりとりかを認識します。
エンドユーザーがログインし、トランザクションコードによりトランザクションを要求すると、まずCICSはターミナルの状況をチェックします。チェック内容としては、該当トランザクションを受け付けていいターミナルなのか、正しいユーザー権限があるかといったことです。
CICSはメッセージの最初の4文字をトランザクションID(TRID)と見なします。この情報はCICSタスクコントロールに渡され必要に応じ、要求を処理する、新しいタスクが作られます。

タスクコントロール

タスクコントロールはCICSタスクの状況を管理しています。タスクは一見、並行して稼働しますが、プロセス時間と割り当ての優先度をコントロールしなければなりません。例えば、新規のトランザクション受付けより先に、トランザクションログ処理は優先します。CICSは独自の内部マルチタスクにより、トランザクション処理をするアプリケーションをコントロールします。
タスクコントロールは、トランザクションを処理するタスクを生成します。CICSタスク下で稼働するプログラムのすべての情報はあらかじめCICS Program Control Table(PCT)に登録されていなければなりません。PCTはCICSタスクのひとつのエントリーです。
タスクコントロールはPCT内のTRIDを見つけます。次にCICSストレージコントロールにタスクに関連したコントロールブロックの作成の依頼をし、プログラムコントロールにアプリケーションプログラムのロードを依頼します。

プログラムコントロール

Cプログラムコントロールはアプリケーションプログラムのロードと削除を担当します。トランザクション処理がタスクとしてスタートすると、プログラムコントロールはアプロケーションプログラムに関連したタスクに制御権を渡します。
多くのタスクが同じアプリケーションプログラムを使うことがあります。プログラムコントロールはメモリーにはひとつのプログラムしか置きません。それぞれのタスクは別々に存在します。そうやって多くのユーザーがひとつの物理的アプリケーションプログラムのコピーを並行して共有して使うことができます。

ストレージコントロール

OS/390などの環境下では、CICSは仮想記憶領域内を完全にコントロールします。ストレージコントロールは、仮想記憶域の獲得、コントロール、開放を担当します。この仮想記憶域はCICS自身がロードされている空間です。
管理されている仮想領域は、プログラム、I/Oエリア、ワーク用スペースなどなどに使われます。
ストレージコントロールはストレージをプールとして管理しています。要求ごとに、CICSアプリケーションやCICSの中核のサービスにストレージリソースを割り当てたり開放したりします。

CICS COMMAREAは特別な保管域です。これはトランザクションをまたがって、データが受渡される機能です。COMMAREAは仮想的な会話として別プログラムにデータを渡せます。
データはCICS RETURNコマンドが出されると保管されます。同じターミナルから入力メッセージがやってくると、関連づけられたCOMMAREAとTRIDにコントロールが渡されます。

さらに、トランザクションのタイプ(COMMAREAインターフェーストランザクション)によってはこのインプットもアウトプットもCOMMAREAにできます。このようなトランザクションは、RPCのような使い方がされます。この場合、トランザクション内に端末にデータを表現する、プレゼンテーションコードはありません。

ファイルコントロール

ファイルコントロールはディスクファイルの共有が可能となっています。すべてのファイルコントロールに関係するデータブロックおよびバッファーはCICS File Control Table(FCT)内にあります。FCTはCICSに関連づけられたファイルごとにエントリーができます。これは複数のトランザクションによる複数のREADやUPDATE処理を矛盾を起こさずに処理できます。CICSは同時に同じレコードを二人のユーザーがアップデートすることがないように管理しています。
ファイルコントロールはファイルやデータベースの整合性も管理します。リカバリーリスタートは特別なジャーナルファイルとディスクを前提としたリカバリーデータによりなされ、トランザクションのACID属性を保証しています。これは2フェーズコミット方式で行わrます。DBMSもやはり2フェーズコミットをサポートしますから、CICS RecoveryRestartの際にデータは保護されます。

タイマーサービス

タイマーサービスはアプリケーションが時間に依存したコントロールをする機能を提供します。例えば、特定のトランザクションを特定の時間に起動したり、特定の時間が来たら通知する、といったことです)

トランザクション処理用端末

GUIはターミナルの力によります。327xのようなキャラクターベースのターミナルはCUI(Character oriented User Interface)といいますが、基本的に24行、80+アルファ文字から構成されます。

ホストコンピュータ内でターミナルスクリーンイメージをアプリケーションプログラムは生成します。
スクリーンイメージは特定の場所をフィールドとして解釈したほうが簡単です。CICSのユーティリティでBMS(Basic Mapping Support)でスクリーンイメージを生成できます。

01 +ACCOUNT FILE: +RECORD DISPLAY
02
03 +ACCOUNT NO:+_________ +LASTNAME: +________________________|
04 +FIRSTNAME:+________________________+? MI:+_+ TITLE:+_____|
05 +PHONE:+______________ +ADDRESS: +___________________________________|
06 +___________________________________|
07 +___________________________________|
08? +INFO: +_____________________________________________________________________|
09
10? +HISTORY: BALANCE PLAN AMOUNT PAID AMOUNT
11 +________ __/__/_____ _____________ __/__/_____ _____________
12 +________ __/__/_____ _____________ __/__/_____ _____________
13 +________ __/__/_____ _____________ __/__/_____ _____________
14 +________ __/__/_____ _____________ __/__/_____ _____________
15 +________ __/__/_____ _____________ __/__/_____ _____________
16 +________ __/__/_____ _____________ __/__/_____ _____________
17 +________ __/__/_____ _____________ __/__/_____ _____________
18 +________ __/__/_____ _____________ __/__/_____ _____________
19
20
21
22 +_______________________________________________________________________________

PCの3270エミュレータは、3278,3270,3178といったメジャーなターミナルをサポートしていますし、GUIでさらに使い勝手をよくすることが可能です。

ネットワーク

CICSはSNAを基本としています。3270データストリームはレイヤー5に相当するプロトコルです。基本的に文字を送るものなので、今から見るとかなり狭い帯域でも問題はありません。
Filed in メインフレーム・ソフトウェア

一時的VSAMデータセットを使う

By kamii - Last updated: 月曜日, 5月 17, 2010

業務用アプリケーションプログラムでは、先行ステップで作成したデータセットを後続ステップで読み込んで、さらに別の処理を行う、といった手法は大変よく利用されています。この際に、データ内容をステップ間でのみ受け渡し、ジョブが終われば保管の必要がない作業用データであれば、一時的データセットとして割り当てることができます。一般に、一時的データセット(1つのジョブ内でのみ有効なテンポラリー・ファイル)と言えば、順次編成データセットを使うことが多いでしょう。場合によっては区分データセットを割り振ることもありますが、COBOL言語などで作成される一般的なアプリケーションプログラムでは直接区分データセットを使うことは少なく、使ったとしてもJCLにメンバー名まで指定してメンバー自身を順次編成ファイルとしてアクセスすることの方が多いのではないかと思います。
ところがプログラムの処理として、一時的データとはいえ、キーによるアクセスなどを行いたい時は、順次データセットでは思うようにいきません。そのため先行ステップでAMSユーティリティーを実行して、VSAMデータセットを作成し、後続ステップでアクセスした後、最終ステップで削除したり、ボリューム上にそのまま残しておき、次の実行時に割り振り前に削除をする、などを行っていることもよくあります。

MVS(z/OS)ではこのような場合、AMSユーティリティーでVSAMを事前割り振りしなくても、PSやPDS同様にVSAMファイルも一時的データセットとして割り振り使用することができます。この方法を使うとJCLもすっきりしますから知っておいて損はありません。


従来からよく使われるAMSユーティリティーを組み合わせるJCL例

先行のSTEP001でキー付きレコードの作業用ファイルを作り、後続のSTEP002およびSTEP003でそのファイルを読んで帳票データを作るジョブがあるとします。


一時的VSAMデータセットを使用するJCL例

同じことは次のようなJCLに置き換えることができます。もちろんJCLの変更に伴ってプログラムを修正する必要はありません。

STEP003でもDISP=PASSを指定してますが、割り振った一時的VSAMデータセットはジョブエンドの際にパージされます。DISP=(OLD,DELETE)としてもかまいません。


REPROの代わりにGENERで初期レコードを読み込ませるJCL例

割り振るVSAMデータセットに初期レコードのローディングが必要な場合、AMSユーティリティーのREPROを使わなくとも、GENER(ICEGENER)で同じことができます。

JCL内ストリームデータ(DD *)ですが、入力レコードの80バイトのうち、出力先VSAMデータセットのレコード長64バイトに合わせて、先頭の64文字分だけが書き込まれます。80より長いレコードであれば、初期レコードが格納された別の順次データセットなどを指定できます。
※一時的VSAMの作成先デバイスにUNIT=VIOを指定すると、SMSはアロケーションに失敗し、GENERユーティリティーがS0C4でABENDします。一時的データセットではありますが、VSAMの場合はUNIT=SYSDAを指定すれば大丈夫です。もっとも最新のz/OSではVIOがサポートされているかも知れませんが...


AMSユーティリティーを使わないVSAMの割り振りやコピーは、特別新しい機能ではなくMVS/DFPがDFSMSに変わったときからサポートされていたようです。MVS/ESAの頃はSMS自体の運用はオプションだったので、日本ではまだ一般的ではありませんでしたが、現在のz/OSではSMSは標準でアクティブでなっていますから、当たり前に利用できる機能になっています。しかし運用に乗ってしまっているジョブのJCLの場合、あえて変える必要もないため今でもAMSユーティリティーによる割り振りやコピーがよく利用されています。もしご存じでなかったら、何かの機会のときにでも試してみて下さい。
私が知る限り、同じ機能はMSPとVOS3にはありませんでした。最新のMSPとVOS3でも恐らく同じかと思います。

Filed in ありがたいサンプルJCL, 知っておくと便利なテクニックなど

VTAM概説

By takao - Last updated: 金曜日, 5月 7, 2010

SNA

VTAMについて語る前に、IBMが作った通信プロトコルSNAについて語る必要がある。

Systems Network Architecture(SNA)は、1970年代にIBMのコンピュータを通信させるために考えられたアーキテクチャである。アーキテクチャ上、重要な点はレイヤーという概念を持ったことと、ホストコンピュータが中心であるという考え方にある。
レイヤーについては後世、標準化として出されたOSIに踏襲され、図のような関係とされる。


ホストコンピュータは、数万台の端末を制御するために専用のコンピュータ、すなわち通信制御装置をI/O装置として必要とする。通信制御装置は、NCP(NetWork Control Program)と呼ばれる制御プログラムと端末の構成情報を内蔵した。
具体的には、通信制御装置は接続された回線、端末に向かいポーリング(呼びかけ信号)をかける。データ転送を要求した端末に向かってデータを受信、もしくは送信する。

このアーキテクチャは時代を下って、TCP/IPのような、知らないアドレスへのルーティング可能な通信アーキテクチャとの整合性が取れなくなった。

VTAM

VTAM(Virtual Telecommunications Access Method)もしくはACF/VTAMは、IBMのSNAを具現化した通信プログラムである。
VTAMはNCPと同様の回線、端末属性を知り、通信を制御した。ユーザーから見ると通信の流れはおよそ次のような形である。
VTAMはSNA上で定義されたSystems Services Control Point(SSCP)という自分の管理している世界(ドメインという)の資源管理をする。なお、ドメイン同士の接続は可能であり、マルチドメインといい。SNIというSSCP同士の会話でネットワークを構成する。

SNAネットワークを構成する要素として、SSCPの他、Logical Unit(LU)とPhysical Unit(PU)がある。PUとLUの定義そのものは深淵な議論がなされるため、以下で具体的な定義をあげる。いずれもタイプと呼ばれる番号で特性が定義されている。

PU

2. クラスターコントローラ
3. インテリジェントコントローラ(3174,3274,3276)
4. 通信制御装置 (3270,3745,3725,3705)
5. SSCPをもったホストノード (308x, 9370,3090,4300)

通信回線はSDLCであり、LANはトークンリング接続のLLCが使われた。


LU

0. SNAではないもの(IMS,CICS,JES,3270BSC)
1. (使われていない)
2. ディスプレイ、3270データストリームを使うもの (3270ディスプレイ)
3. プリンター、3270データストリームを使うもの (3274経由3287プリンタ)
4. ひとつもしくは複数のディスプレイセッション、SNAチャラクターストリーム(CICS/VS 6670)
6.1 アプリケーションサブシステム(CICS/VS, IMS/VS)
6.2 アプリケーション間通信、(APPC, AS/400, CICS)
7. ホストとミッドレンジのプロセッサ間 (3090とs/38)

LUの中で特筆するべきなものは、LU6.2である。これはAdvanced Program-to-Program Communication(APPC)という対等な通信を許すAPIとして作られた。これを利用して、NetBIOSなどがメインフレーム上で実現された。

VTAMとTCP/IP

Windows, AIXなどにおいてTCP/IPは標準であったが、SNAの通信は複雑である。そのため、最初は、SNAサーバーfor AIXやSNAサーバー for WindowsNTという製品が作られ、3174制御装置の代わりにおかれPC上で端末エミュレータを動作させることとなった。

現在のメインフレーム上ではすでにTCP/IPを動作させることが可能である。パケット交換のために3172(パススルーモード)という装置をつければ外部とTCP/IPで通信可能である。

端末用の3270データストリームを変換してターミナルエミュレータ、プリンターに表示するTN3270というプロトコルがあり、変換ゲートウェイがある。TN3270についてはこれはRFC(1041,1576,1646,1647)上で定義されている。またVTAMのプリンターLU用のデータをTCP/IPベースのプリンターデータに変換するソフトウェアもある。

参考:

http://www.francome.com/sna.html
Filed in メインフレーム・ソフトウェア

IEHPROGM

By kamii - Last updated: 水曜日, 4月 28, 2010

IEHPROGM:順次データセット、区分データセット・メンバーのオペレーション・ユーティリティー

IEHPROGMは(z/OS)における、順次データセット、区分データセット・メンバーのリネームと削除などを行うユーティリティー・プログラムの名前です。MSPではJSGPROGM、VOS3ではJSFCTLGとして提供されています。プログラム名は異なるものの、JCLもSYSIN制御ステートメントも含め、基本的に互換ユーティリティーです。

IEHPROGMではデータセットやメンバーの名前を変えたり、削除を行う際に、カタログの変更までは行われません。カタログも併せて変更するには同時にそのデータセットのアンカタログ、再カタログを制御ステートメントで指定しなければなりません。カタログ・エントリーはリネームやスクラッチの際に自動的には更新されません。このユーティリティーが提供された頃のOSではカタログを使うことは今ほど一般的ではありませんでした。言い換えれば業務処理で使うデータセットはカタログを使わなくても、十分管理できる程度の規模(数)で運用されていたからでもあります。今でもユーティリティーの機能は互換ですから、カタログ・エントリーの変更や削除が自動的にされない点も変わっていません。

SMS管理データセットなど、カタログが前提の今日のシステム運用では、IEHPROGMを使う機会はめっきり少なくなりました。特にSMS管理データセットのカタログやアンカタログはIEHPROGMでは行うことができません。データセットやメンバーのリネームと削除は、非VSAMデータセットであってもAMSユーティリティーで行うことができますし(AMSならカタログも同時に変更される)、削除だけならJCLのDD文(DISPパラメーター)で簡単に行えます。また、ISPFなどの対話型ユーティリティーなら操作も簡単です。

その他にパスワード・データセットの保守機能がありますが、こちらはRACFによるセキュリティー管理が必須となった現在では新たに覚える必要もないでしょう。

昔から運用されてきたバッチ処理の中で、IEHPROGMユーティリティーがそのまま使われていることもあります。そのようなJCLを解析するような際の知識として知っておけば十分ではないかと考えます。

//DSOPERAT EXEC PGM=IEHPROGM
//SYSPRINT DD SYSOUT=*
//DASD     DD DISP=OLD,UNIT=SYSDA,VOL=SER=ZDAT02
//SYSIN    DD *
 RENAME DSNAME=TEST.DATA1,NEWNAME=TEST.DATA2,VOL=SYSDA=ZDAT02
 SCRATCH DSNAME=TEST.DATA3,VOL=SYSDA=ZDAT02
//

カタログ・エントリーも同時に変更するには次のように指定する。
//DSOPERAT EXEC PGM=IEHPROGM
//SYSPRINT DD SYSOUT=*
//DASD     DD DISP=OLD,UNIT=SYSDA,VOL=SER=ZDAT02
//SYSIN    DD *
 RENAME DSNAME=TEST.DATA1,NEWNAME=TEST.DATA2,VOL=SYSDA=ZDAT02
 UNCATLG DSNAME=TEST.DATA1
 CATLG DSNAME=TEST.DATA2,VOL=3390=ZDAT02
 SCRATCH DSNAME=TEST.DATA3,VOL=SYSDA=ZDAT02
 UNCATLG DSNAME=TEST.DATA3
//

同じ事をするAMSのJCL。
//DSOPERAT EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 ALTER TEST.DATA1 NEWNAME(TEST.DATA2)
 DELETE TEST.DATA3
//

区分データセットのメンバーのリネームと削除についてのサンプルは、「区分データセットのメンバー名変更と削除(IEHPROGM)」および「非VSAMデータセット(PS,PDS)の操作いろいろ(IDCAMS):区分データセットのメンバーを改名(リネーム)する、削除する」のページを参照して下さい。

Filed in キーワードから(何が知りたいですか)

ストレージってヤツは!

By takao - Last updated: 水曜日, 3月 31, 2010
1980年の20GB。重さ2トン。
2010年の30GB。重さ0.5グラム。
Filed in つぶやき・雑感

EXCPでDASDボリュームのトラックをまるごと読み込むサンプル

By kamii - Last updated: 木曜日, 3月 4, 2010

いただいた質問に答えるために書いたサンプルです。せっかくなので記事として残しておきます。実際には昔作ったプログラムを人様に見せられるように整理しただけのものです。

EXCPを使いCCWを直接投げる場合でも、本来ならばI/Oするデータセットに対応したDD文を定義してDCBをOPENします。OSはOPENによって作成されるDEBによって、例えEXCPと言えどもアクセスできる範囲を厳格にチェックします。通常はターゲット・データセットのエクステント内に限られます。VTOCをアクセスする場合は、RDJFCBとOPEN TYPE=Jを利用しDSNとして44文字のx04を使ってVTOCを1つのPSデータセットとしてOPENすることもできます。

元の質問の主旨は誤って削除してしまったデータセットがあるが、ボリュームのトラック上にはデータが残っているので、それをEXCPによって読み出すことはできないか、ということでした。この場合、削除してしまったデータセットであることがポイントになります。つまりDD文では定義できないデータセットになります。消してしまったデータセットではQSAMやBSAMなどを使うことはできませんから、EXCPを使うことになります。しかしDD文を定義できないのでボリューム上の任意のトラックをI/Oできるようにしなければなりません。OPENは出せませんから、自分でUCBを求めDEBを作ることになります。またDEBはOSが作った正規のものではないので、EXCPルーチンでのDEBの妥当性をスキップさせる必要があります。このサンプルではDCBはDEB領域をREDEFINEしていますが、DCB自体EXCPアクセスではアクセス法ほど意味を持たないので、必要最低限のフィールドの辻褄があえば大丈夫です。

正確なことを言えば、空きスペースに限っては適当な名前のデータセットをABSTRアロケーションして、そのDSNでDD文を定義する方法もあります。具体的なことは機会を改めて紹介します。

伝統的に伝えられてきた技法ですが、キー0(正確には7以下のキー)でEXCPを発行するなら、事前にOPENを出さなくてもI/Oできます。サンプルではUCBを簡単に求めるためにアクセスするDASDボリュームをDD文で定義していますが、UCBLOOKマクロ等で直接UCBアドレスを求めるなら、DD文やDYNALLOCによるアロケーションなしでデバイスに直接I/Oを行うこともできます。ただしONLINEデバイスでなければなりません。

//STEP1    EXEC PGM=READTRAK
//STEPLIB  DD DISP=SHR,DSN=your apf library
//SYSUT1   DD DISP=OLD,UNIT=SYSALLDA,VOL=SER=volser <== I/Oを行う
//                                                      ボリューム名
         LCLC  &MDLNM
&MDLNM   SETC  'READTRAK'               SET THIS MODULE NAME
*---------------------------------------------------------------------*
*        HOUSE KEEPING                                                *
*---------------------------------------------------------------------*
&MDLNM   CSECT
         B     4+68+10(,15)             AROUND PROGRAM HEADER
         DC    17F'-1'                  OUR REGISTER SAVEAREA
         DC    AL1(8)                   MODULE NAME LENGTH
         DC    CL8'&MDLNM'              MODULE NAME
         DS    0H
         USING &MDLNM,RD                DEFINE OUR BASE REGISTERS
         STM   RE,RC,12(RD)             SAVE CALLER REGISTERS
         ST    RD,4(,RF)                SAVE CALLER SAVEAREA POINTER
         LA    RE,0(,RD)                SAVE CALLER SAVEAREA ADDRESS
         LA    RD,0(,RF)                LOAD OUR 1ST BASE ADDRESS
         ST    RD,8(,RE)                SET BACK CHAIN FOR LINK TRACE
         B     MAINPROC                 DO MAIN PROCESSING
         SPACE ,
*---------------------------------------------------------------------*
*        EXIT PROCESSING                                              *
*---------------------------------------------------------------------*
EXITPROC DS    0H
         L     RD,4(,RD)                LOAD CALLER SAVEAREA
         ST    RF,16(,RD)               PASS RETURN CODE TO CALLER
         LM    RE,RC,12(RD)             RESTORE CALLER REGISTERS
         BSM   0,RE                     RETURN TO CALLER
         EJECT ,
***********************************************************************
*        MAIN PROCESSING                                              *
*        =====================================================        *
*        GR0 -- N/A                                                   *
*        GR1 -- EXEC PARAMETER PLIST                                  *
*        GR13 - BASE REGISTER AND OUR REGISTER SAVEAREA               *
***********************************************************************
MAINPROC DS    0H
*                                  *----------------------------------*
*                                  *  SETUP EXCP I/O PROCESSING       *
*                                  *  ==============================  *
*                                  *----------------------------------*
         EXTRACT DOUBLE,'S',FIELDS=TIOT EXTRACT OUR TIOT ADDRESS
         L     RA,DOUBLE                LOAD TIOT ADDRESS
         LA    RA,TIOENTRY-TIOT1(,RA)   LOCATE TO 1ST DD ENTRY
         USING TIOENTRY,RA              ADDRESS IT
         SLR   RF,RF                    CLEAR WORKREG
         CLC   TIOEDDNM,=CL8'SYSUT1'    IS HERE SYSUT1 DD ENTRY ?
         BE    *+4+4+4+4                YES, FOUND IT
         IC    RF,TIOELNGH              ADD CURRENT ENTRY LENGTH
         LA    RA,0(RF,RA)              LOCATE TO NEXT ENTRY
         B     *-4-4-4-6                FIND OUR DD STATEMENT
         MVC   DEBUCBAD,TIOEFSRT        SET UCB(CAPTURED) ADDR TO DEB
         DROP  RA                       FORGET TIOT
         SPACE ,
         L     R0,LIOBUF                LOAD I/O BUFFER LENGTH
         GETMAIN RU,LV=(0),BNDRY=PAGE   GETMAIN EXCP I/O BUFFER
         ST    R1,AIOBUF                SAVE IT
         STCM  R1,B'0111',CCWRTRK+1     AND SET IT IN CCW
         LR    R0,R1                    INIT I/O BUFFER(NULL CLEAR)
         L     R1,LIOBUF                 I
         L     RF,=A(X'00000000')        I
         MVCL  R0,RE                     V
         SPACE ,
         L     RF,PSATOLD-PSA(0,0)      LOAD OUR TCB
         STCM  RF,B'0111',DEBTCBAD      SET INTO DEB
         MVC   DEBDEBID,TCBPKF-TCB(RF)  SET TCBPKF
         OI    DEBDEBID,X'0F'           CORRECT TO DEBID
         SPACE ,
         MODESET MODE=SUP               CHANGE US TO SUP STATE
         SPACE ,
*                                  *----------------------------------*
*                                  *  ISSUE EXCP TO READ TRACK DATA   *
*                                  *  ==============================  *
*                                  *----------------------------------*
*                                  ここで読み込むトラックのアドレスを指定する。
         MVC   IOBCC,=XL2'0000'         SET SEEK ADDR(CYLINDER NUMBER)
         MVC   IOBHH,=XL2'0001'         SET SEEK ADDR(TRACK NUMBER)
         SPACE ,
DOEXCP   DS    0H
         SPKA  0                        CHANGE TO PSWKEY=0
         EXCP  IOB                      ISSUE EXCP I/O
         SPKA  X'80'                    BACK TO SAFE KEY
         WAIT  ECB=ECB                  WAIT FOR I/O COMPLETION
         CLI   ECB,X'7F'                NORMAL COMPLETION ?
         BE    *+4+2+4+4                YES, CONTINUE PROCESSING
         SLR   RF,RF                    NO, ABORT PROCESSING WITH ERRCD
         IC    RF,ECB                   LOAD COMPLETION CODE INTO GR15
         B     EXITPROC                 PROCESSING DONE
         SPACE ,
         SLR   RE,RE                    CLEAR READ LENGTH
         ICM   RE,B'0011',IOBRDUAL      LOAD RESIDUAL COUNT
         L     R0,=F'65535'
         SR    R0,RE                    GR0 --> READ LENGTH            +
                                        (ACTUAL DATA LENGTH ON TRACK)
         L     R1,AIOBUF                GR1 --> ALL CKD DATA ON TRACK
         SPACE ,
*                 読み込んだトラックデータはGR1が示す領域に格納されている。
*                 長さはGR0に入っている。IOBRDUALはREADコマンドで指定した
*                 読み込み長に対して、読み残した長さが入っている。
*                 実際に書かれているデータが短い場合などである。
*                 メモリー内のデータはトラックに書かれているR1以降のすべての
*                 ブロックがCKDの形式で並ぶ。トラックからGAPを抜いたような感じ。
*
*        ADD YOUR OWN CODE
*
*
         SPACE ,
*        他のトラックも読むなら、そのアドレスをIOBにセットしてDOEXCPから再実行する。
*
*        SET NEXT TRACK ADDRESS IF NEED...
*
*        B     DOEXCP                   READ NEXT TRACK AGAIN
*
         SPACE ,
         SLR   RF,RF                    CLEAR COMPLETION CODE
         B     EXITPROC                 PROCESSING DONE
         EJECT ,
***********************************************************************
*        I N T E R N A L  S U B  R O U T I N E S                      *
***********************************************************************
         EJECT ,
***********************************************************************
*        DATA AREA (CONSTANTS)                                        *
***********************************************************************
*                                  *----------------------------------*
*                                  *  MISCELLANEOUS                   *
*                                  *----------------------------------*
         SPACE ,
***********************************************************************
*        DATA AREA                                                    *
***********************************************************************
*                                  *----------------------------------*
*                                  *  MISCELLANEOUS                   *
*                                  *----------------------------------*
DOUBLE   DC    D'0'                     DOUBLE WORD WORKAREA
*                                  *----------------------------------*
*                                  *  PROCESSING WORKS                *
*                                  *  ==============================  *
*                                  *----------------------------------*
LIOBUF   DC    A(64*1024)               I/O BUFFER LENGTH
AIOBUF   DC    A(0)                     64KB I/O BUFFER
         SPACE ,
*---------------------------------------------------------------------*
*        C C W                                                        *
*---------------------------------------------------------------------*
         DC    0D'0',CL8'CCW CCW '      FOR DIAGNOSE
CCWRMCKD DS    0D                       (FOR TRACK READ)
         CCW   X'39',IOBCCHHR,X'40',4   SERACH HA EQ
         CCW   X'08',CCWRMCKD,X'00',0   TIC BACK
CCWRTRK  CCW   X'5E',0,X'20',65535      READ MULTIPLE CKD
LNRMCKD  EQU   *-CCWRMCKD               LENGTH OF CCW
*
*        ECKDデバイスであれば、LOCATE RECORDとREAD TRACKコマンドを
*        使う方がいいが、特定の目的のために一時的に使うようなプログラムなら
*        従来からあるREAD MCKDコマンドの方がわかりやすい。
*
         SPACE ,
*---------------------------------------------------------------------*
*        E C B + I O B                                                *
*---------------------------------------------------------------------*
         DC    0D'0',CL8'ECB ECB '      FOR DIAGNOSE
ECB      DC    F'0'                     ECB
         DC    0D'0',CL8'IOB IOB '      FOR DIAGNOSE
IOB      DS    0D        IOB STANDARD SECTION(40BYTES)
IOBSTDRD DS    0D
IOBFLAG1 DC    AL1(IOBCMDCH+IOBUNREL)  FLAG BYTE 1
IOBDATCH EQU   X'80' -   DATA CHAINING USED IN CHANNEL PROGRAM
IOBCMDCH EQU   X'40' -   COMMAND CHAINING USED IN CHANNEL PROGRAM
IOBUNREL EQU   X'02' -   IOB UNRELATED FLAG (I.E., NONSEQUENTIAL)
IOBFLAG2 DC    AL1(0)    FLAG BYTE 2
IOBSENS0 DC    AL1(0)    FIRST SENSE BYTE
IOBSENS1 DC    AL1(0)    SECOND SENSE BYTE
IOBECBPT DS    0A    -   ADDRESS OF ECB
IOBECBCC DC    AL1(0)    I/O COMPLETION CODE
IOBECBPB DC    AL3(ECB)
IOBFLAG3 DC    AL1(0)    FLAG BYTE 3
IOBCSW   DS    0XL7      COPIED CHANNEL STATUS WORD
IOBCMDA  DC    AL3(0)    FINAL CCW ADDRESS
IOBUSTAT DC    AL1(0)    DEVICE STATUS CODE
IOBCSTAT DC    AL1(0)    CHANNEL STATUS CODE
IOBRDUAL DC    AL2(0)    REMAIN BYTE COUNT(RESIDUAL COUNT)
IOBSTART DS    0A    -   ADDRESS OF CHANNEL PROGRAM TO BE EXECUTED
         DC    AL1(0)
IOBSTRTB DC    AL3(CCWRMCKD)
IOBDCBPT DS    0A    -   ADDRESS OF DCB ASSOCIATED WITH THIS IOB
         DC    AL1(0)
IOBDCBPB DC    AL3(DCB)
         DC    AL4(0)
         DC    AL4(0)
IOBEXTEN DS    0D
IOBSEEK  DS    0XL8  -   A SEEK ADDRESS(IN THE FORMAT MBBCCHHR)
IOBM     DC    X'00'     THE NUMBER OF THE DEB EXTENT
IOBBB    DS    0XL2  -   BIN NUMBER(DATA CELL)
IOBBB1   DC    X'00'
IOBBB2   DC    X'00'
IOBCCHHR DS    0XL5  -   FORMAT CCHHR
IOBCC    DS    0XL2  -   CYLINDER NUMBER
IOBCC1   DC    X'00'
IOBCC2   DC    X'00'
IOBHH    DS    0XL2  -   TRACK NUMBER
IOBHH1   DC    X'00'
IOBHH2   DC    X'00'
IOBR     DC    X'00' -   RECORD NUMBER
LIOB     EQU   *-IOB
         SPACE ,
*---------------------------------------------------------------------*
*        I/O APPENDAGE ROUTINE (DUMMY ROUTINE FOR OUR EXCP I/O)       *
*---------------------------------------------------------------------*
         DC    0D'0',CL8'APENDAGE'      FOR DIAGNOSE
IOAPENDR BR    14                       DUMMY APPENDAGE ROUTINE
         SPACE ,
*---------------------------------------------------------------------*
*        D E B (SIMULATE DEB FOR EXCP I/O)  AND  D C B (DUMMY)        *
*---------------------------------------------------------------------*
         DC    0D'0',CL8'DEBAVT-8'      FOR DIAGNOSE
DEBAVT   DS    0D                       DEB -36 (DEB APPENDAGE VECTOR)
DEBEOEA  DC    A(IOAPENDR)              EOE APPENDAGE ROUTINE
DEBSIOA  DC    A(IOAPENDR)              SIO APPENDAGE ROUTINE
DEBPCIA  DC    A(IOAPENDR)              PCI APPENDAGE ROUTINE
DEBCEA   DC    A(IOAPENDR)              CHANNEL-END APPENDAGE ROUTINE
DEBXCEA  DC    A(IOAPENDR)              ABNORMAL-END APPENDAGE ROUTINE
DEBPREFX DS    0A                       DEB -16 (DEB PREFIX)
DEBWKARA DC    XL1'00'                  IOS WORKAREA
DEBDSCBA DC    XL7'00'                  IOS USE DSCB ADDRESS
DEBXTNP  DC    A(0)                     POINTER TO DEB EXTENSION
DEBLNGTH DC    AL1(12)                  LENGTH OF DEB IN DOUBLE WORDS
DEBAMTYP DC    XL1'00'                  ACCESS METHOD TYPE
DEBTBLOF DC    H'0'                     OFFSET IN DEB TABLE OF THIS DEB
DEB      EQU   *
DEBBASIC DS    0A                       DEB +0 (DEB BASIC SECTION)
DEBNMSUB DC    AL1(0)                   NUMBER OF SUB ROUTINES
DEBTCBAD DC    AL3(0)                   TCB ADDRESS
DEBAMLNG DC    AL1(16)                  ACCESS METHOD LENGTH
DEBDEBAD DC    AL3(0)                   NEXT DEB ADDRESS
DEBOFLGS DC    XL1'60'                  DATASET STATUS FLAG
DEBIRBAD DC    AL3(0)                   IRB ADDRESS
DEBOPATB DC    XL1'0F'                  TYPE OF I/O
DEBQSCNT DC    AL1(0)                   PURGE QUIESCE COUNT
DEBFLGS1 DC    XL1'00'                  FLAGS 1
DEBFLGS2 DC    XL1'00'                  FLAGS 2
DEBNMEXT DC    AL1(1)                   NUMBER OF EXTENTS
DEBUSRPB DC    AL3(0)                   USER PURGE CHAIN
DEBPRIOR DC    AL1(250)                 PRIORITY
DEBECBAD DC    AL3(0)                   PLIST TO FIND PURGE ECB
DEBDEBID DC    XL1'0F'                  DEBID
DEBDCBAD DC    AL3(DCB)                 DCB ADDRESS
DEBEXSCL DC    AL1(4)                   EXTENT SCALE
DEBAPPAD DC    AL3(DEBAVT)              I/O APPENDAGE VECTOR TABLE
DEBDASD  DS    0A                       DEB +32 (DEB DASD SECTION)
DEBDVMOD DC    XL1'10'                  DEVICE MODIFIER - FILE MASK
DEBUCBAD DC    AL3(0)                   UCB ADDRESS
DEBBINUM DC    XL2'00'                  BIN NUMBER
DEBSTRCC DC    XL2'00'                  STARTING CYLINDER
DEBSTRHH DC    XL2'00'                  STARTING TRACK
DEBENDCC DC    XL2'FFFF'                ENDING CYLINDER
DEBENDHH DC    XL2'FFFF'                ENDING TRACK
DEBNMTRK DC    XL2'FFFF'                NUMBER OF TRACKS IN EXTENT
DEBVOLSQ DC    H'1'                     VOLUME SEQUENCE NUMBER
DEBVOLNM DC    H'1'                     NUMBER OF VOLUMES
         DC    2F'0'                    RESERVE
DCB      EQU   *-44                     DEFINE DUMMY DCB
DCBDEBAD DC    A(DEB)                   DEB ADDRESS
*---------------------------------------------------------------------*
         LTORG ,                        USER LITERAL PLACE AT HERE
         DROP  ,                        FORGET ALL BASE REGISTER
***********************************************************************
*        DATA AREA (OUTSIDE OUR BASE)                                 *
***********************************************************************
*---------------------------------------------------------------------*
*        LOCAL WORKAREA                                               *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
*        LOCAL DSECTS                                                 *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
*        GLOBAL DSECTS                                                *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
*        S/370, ESA/390 REGISTER EQUATES                              *
*---------------------------------------------------------------------*
*------- YREGS ,                        OS: REGISTER EQUATES
R0       EQU   0                        GENERAL REGISTER 0
R1       EQU   1                        GENERAL REGISTER 1
R2       EQU   2                        GENERAL REGISTER 2
R3       EQU   3                        GENERAL REGISTER 3
R4       EQU   4                        GENERAL REGISTER 4
R5       EQU   5                        GENERAL REGISTER 5
R6       EQU   6                        GENERAL REGISTER 6
R7       EQU   7                        GENERAL REGISTER 7
R8       EQU   8                        GENERAL REGISTER 8
R9       EQU   9                        GENERAL REGISTER 9
RA       EQU   10                       GENERAL REGISTER 10
RB       EQU   11                       GENERAL REGISTER 11
RC       EQU   12                       GENERAL REGISTER 12
RD       EQU   13                       GENERAL REGISTER 13
RE       EQU   14                       GENERAL REGISTER 14
RF       EQU   15                       GENERAL REGISTER 15
*---------------------------------------------------------------------*
*        OS CONTROL BLOCKS                                            *
*---------------------------------------------------------------------*
******** PRINT NOGEN
         IHAPSA ,                       PSA
         IKJTCB ,                       TCB
DTIOT    DSECT ,
         IEFTIOT1 ,                     TIOT
         END
Filed in 未分類