REXXからMVSデータセットにアクセスする

以前にUSSシェルからZOAU(*1)を利用することでMVS側の様々なリソースにアクセスできることを紹介しました。しかし、同様のことはREXXとSDSFの組み合わせでとっくの昔にできていました。ここでは視点を変えてUSS側からのPython+ZOAUではなく、MVS側のコマンドシェルであるTSOからのREXX+SDSFで同様の処理を行う方法を紹介します。併せてUSS側からMVS側のREXXを実行する方法も紹介します。


*1 シェル・コマンドやPythonやJavaなどからのAPIコールによって、USS側から容易にMVS側リソースにアクセスできる機能。

REXXでは外部(環境)コマンドによってMVSデータセットにアクセスすることができます。以下は、MVSデータセットの内容を読み込んで別のデータセットにコピーするプログラム・サンプルです。データセットのアクセスには、TSOコマンドのALLOCとFREE、MVSホスト・コマンドのEXECIOを使用します。

REXXのEXECIOはDDステートメントに対するデータセット入出力機能なので、最初にデータセットをアロケーションしておく必要があります。ADDRESS TSOでALLOCコマンドを実行し、入力側と出力側のデータセット(PDSメンバー)をそれぞれINとOUTのDD名で割り振っています。データセットを割り振れば、後はADDRESS MVSでEXECIOを実行すればデータセットにアクセスできます。EXECIOのDISKRではデータセットのレコード内容はスタックに格納されますので、その内容をそのままDISKWで別データセット(別メンバー)に書き出しています。

以下が、ISPFコマンドシェルから実行した結果です。TSOのフォアグラウンド・セッションで実行された場合は、コピーされた出力側のデータセット内容をISPFブラウザーを起動して表示しています。REXXならISPFユーティリティーの呼び出しも簡単です。

TSO端末(ISPFコマンド・シェル)ではなくバッチジョブとして処理する場合は、下記のようなJCLで実行できます(*2)。


*2 サンプルは標準のTMPであるIKJEFT01を使用しているが、他にもIRXJCLを使用する方法もある。詳細は「z/OS TSO/E REXXユーザーズ・ガイド」を参照。

以下は、TSOのバッチセッションから実行した結果です。ISPFブラウザーを起動する代わりにコピーされた出力側のデータセット内容を読み込んでSAY命令で標準出力(TSOの場合はSYSTSPRT)に表示しています。あくまでもTSOフォアグラウンド時のISPFブラウザー起動の代わりとしてサンプル用に追加した処理なので、実際に行う必要はないでしょう。

<USSからMVS REXXを実行する>

USSシェル内でもREXXを実行することはできますが、MVSホスト・コマンドを実行できないためMVS側で実行した時と同様の処理はやりにくいです。TSOコマンドは実行できるので、REXXをUSSシェル内ではなくMVS側のTSOバッチセッションとして実行させることができます。この方法ならREXXはMVS側環境で実行されるため、MVSリソースに直接アクセスできます。下記のREXXサンプルdorexxは、MVS側のライブラリーに格納されているREXX execを、MVS側のTSOバッチセッションで起動されるようUSSシェルからキックするものです。dorexx自体はUSSシェル内で実行されますが、dorexxから起動するREXX execはMVS側のアドレス空間で実行されます。

以下が、USSシェルからdorexx経由でMVS側REXXを実行した結果です。MVS側で実行したSAY命令の出力は、USSシェル側の標準出力(STDOUT)にリダイレクトされます。

USSシェル内でもREXXそのものを実行することができるので、主たる処理もUSS側のREXXで行うか主たる処理はMVS側で行うかは、それぞれの利用者が自身にとって最適なものを選択すればいいでしょう。USSシェルをメインにしてz/OSを操作するのであれば、REXXよりもPythonやJavaあるいはシェル・スクリプトが適している場面も多いでしょうし、逆にMVS側のTSO(ISPFやSDSF)をメインにしてz/OSを操作するのであれば、REXXはとても強力なツールですし場合によってはCLISTでも十分なケースもあります。いずれにせよ、特定の使い方に固執せずに適材適所で柔軟な使い分けができるようになるといいでしょう。