REXXからMVSアプリケーションやユーティリティーを実行する

REXXでは直接アプリケーションやユーティリティー・プログラムを呼び出して実行することもできます。非同期に実行されるバッチジョブのサブミットと異なり、REXX側の処理とアプリケーションやユーティリティーの処理を容易に同期させることができます。以下は、DFSORTのICETOOLユーティリティーを呼び出して実行するログラム・サンプルです。REXXからLINKMVSホスト・コマンドを使用しています。

REXXからMVSプログラムを呼び出すこと自体は、ADDRESS LINKMVS “pgmname arg1 arg2 …”と記述するだけなので簡単ですが、元々JCLを使用したバッチジョブとして実行していたものについてはDDステートメントの記述に相当する部分をREXX内で行わねばなりません。このサンプルでも同じですが、プログラムの呼び出しそのものよりは、TSOのALLOCATEとFREEコマンド、DD *ステートメント内へのユーティリティー制御ステートメントの記述に相当する処理(ステートメント内容の記述とEXECIOでの割り振り済みデータセットへの出力)が大半を占めています。

以下が、ISPFコマンドシェルから実行した結果です。ユーティリティーの実行結果が出力されるDD名LISTOUTにはTSO端末を割り当ててあるので、自分でSAY命令で出力しなくてもTSO端末(バッチセッションの場合はSYSOUT)に直接リダイレクトされます。プログラムからの出力内容が表示されてから「ADDRESS LINKMVS pgm」の後に記述したSAY命令の出力が表示されていることで、プログラムが同期呼び出しされていることがわかります。

実践向けの改良

上記で示したサンプルではアプリケーションやユーティリティーからの出力を直接TSO端末にリダイレクトしてしまっているので、このままではJCLでサブミットすることと大差ありません。REXXからプログラムを呼び出す主な目的は処理の自動化であったり、出力結果の解析や加工などでしょう。下記に、プログラムからの出力をREXX内で読み込み解析や加工ができるように改修したサンプルも紹介します。このサンプルではプログラムからの出力内容は自動的に端末にリダイレクトされませんから、「ADDRESS LINKMVS pgm」の後に記述したSAY命令の出力が先に表示されていることがわかります。
LISTOUTデータセットを端末ではなく一時データセットに割り当てて、プログラム実行後にLISTOUTデータセットの内容をEXECIOで読み込むようにしたものです。サンプルでは読み込んだレコードをSAY命令で表示していますが、実際の処理ではここで文字列の解析などを行うことになります。なお、最後の2行で行っているLISTDSIとISPFブラウザーでの表示は実際には不要な処理です。一時データセットの内容をISPFブラウザーで表示するには、実際のDSNと格納VOL名が必要になりますが、それを取得するためのLISTDSI関数を使ったサンプルとして追加しました。デバッグ目的でプログラムからの出力内容を直接見たいような場合に利用できます。

以下が、実行した結果です。