SYSOUTデータセットとは
SYSOUT[データセット]
多くのメインフレーム・システムでは、プログラムの実行結果は出力ファイルとして書き出されます。MVS(MSPやVOS3も含む)の場合は、JES2サブシステムと組み合わせて、JES2スプール内に特別な出力ファイルとして書き出されます。
スプール内の出力データはDD文の指定などによって区分され、仮想のデータセットとして格納されます。これがSYSOUTで、スプール内の個々のSYSOUTをSYSOUTデータセットと呼びます。入力用のデータをスプール内に格納することもでき、こちらはSYSINデータセットと呼ばれます(正確にはJCLストリーム内データセットですが、SYSOUTに対しての意味で一般的にはSYSINデータと呼ばれます)。
SYSOUTを含めスプール内の仮想データセットにはJES2によって内部DSN(userid.jobname.jobid.idnumber.addname)が割り当てられますが、利用者がそれを意識する必要はありません。SDSFを使えばそのDSNを知ることもできますが、一般的なSYSOUT操作でDSNを使うことはないでしょう。
一般にSYSOUTに書き出されるプログラムの実行結果は、処理内容の要約メッセージや、どのようなデータを入力し、どのような処理を行い、どこへ出力したか、といった実行ログリストという形に編集されたものです。例えば各種のユーティリティーやコンパイラーなどはSYSPRINTというDD文に定義されたデータセットに対して、実行サマリーやコンパイルリストといった形で実行結果を出力します。
元々これらのリストは最終的にはプリンターから印刷してその内容を確認していました。プログラムが直接プリンターに印刷・出力するのではさまざまな問題が生じます。プリンターというデバイスは非常に遅い機械です。そのためプログラムの実行速度は遅い機械であるプリンターの印刷速度に引っ張られてしまいます。また1つのプログラムがプリンターを使っていると、他のジョブ(プログラム)はその間、デバイスが空くまで待たなければなりません。用紙がなくなったり、ジャムったりした場合もその復旧時間の間、実行中のプログラムも待っていなければなりません。他にも行送りや改ページなど、プリンターの制御を行うにはハードウェアに依存したI/O処理が必要ですが、これはユーザープログラムにとっては業務処理とは直接関係ありません。それらのようなことからパフォーマンスとスループットの向上、ユーザープログラムの簡易化などの観点から、出力データをスプーリングという方式で制御しています。スプーリングはMVS(JES2)のみならずほとんどすべてのメインフレームOS(ジョブ入力サブシステム)で採用していますし、メインフレームOS以外の多くのオペレーティング・システムでも使われています。
SYSOUTへのデータ出力
//STEP1 EXEC PGM=MYPROG1 //PROGOUT DD SYSOUT=A <-- ここがsysoutへの出力定義 >実はプログラム自身ではSYSOUTに出力するとかDISKのデータセットに書き出すとかの意識は基本的にしません。特にCOBOLなどで作成されるアプリケーションプログラムやアセンブラー言語であっても一般のプログラムであれば、順次データセットとして書き出す、という処理さえ行えばよいようになっています。
ディスクやテープのデータセットに書き出すか、JES2のスプールに書き出すかはJCLで決まります。言い換えればJCLの定義を変えれば、プログラムをいじらなくても運用でデータの書き出し先を自由に変えることができるようになっています。出力データをJES2スプールにデータを書き出すのであれば、DD文でSYSOUTパラメーターを定義します。SYSOUTにはクラスと呼ばれる区分けの識別子があり、JES2ではAからZ、0から9の36種類があります。どのクラスにどのような意味を持たせるかはセンターによって違います。例えばAクラスは高速なレーザープリンター、Bクラスはラインインパクトプリンター、Hクラスはスプール内に留め置かれるホールドクラス、Wクラスはリモート印刷処理を行うためのソフトウェアで処理される、などです。開発作業で作成したCOBOLプログラムのコンパイルジョブの実行結果を、むやみに業務用帳票の印刷を行うプリンターから出力してしまうなどは決してよいことではありません。SYSOUTパラメーターにどのクラスを指定するかは、必ずセンター規約を参照するかシステム管理者に確認することが大切です。なお実行結果(SYSOUT)をTSO端末での表示だけで行い、印刷せずに消去してもかまわない場合は、ホールドクラスを指定することが一般的です。MVSのSDSFなどでは必ずしもホールドクラスである必要はありませんが、ホールドクラスであればSDSF以外のTSO OUTPUTコマンドなどでも処理が可能になります。いずれにせよ利用するセンターの規約で定められていますからそれに従います。
SYSOUTの取り出し
スプール内に書き出されたSYSOUTデータセットは、ジョブが終了すれば自動的にプリンターから印刷されます。これはJES2のライターと呼ばれる機能によって行われます。実際にプリンターから印刷されるかどうかはSYSOUTに指定したクラスによって決まります。プリンターにもクラスが割り当てられており、SYSOUTは同じクラスのプリンターから出力されます。
プリンターに割り当てられていないクラスやホールドクラスのSYSOUTの場合は、そのままスプール内に留め置かれます。JES2コマンドでジョブ単位に消去するか、スプールをクリアーするまでスプールに残ります。スプール内にあるSYSOUTデータセットは、いくつかの方法で取り出すことができます。最も簡単なのはSDSF(MSPの場合はPFD3.8、VOS3の場合はASPENやSOEDIT機能)を使用して、SYSOUT内容をTSO画面に表示するものです。業務運用に乗らないバッチジョブ(例えば、プログラムのコンパイルや臨時のデータバックアップなど)はJCLの実行者によって正しく実行できたかがその都度確認されます。この場合多くはSDSFでジョブログのSYSOUTを画面に表示して、完了コードの値や異常を示すメッセージなどが出ていないかを目視で確認しています。
目視ではなくSYSOUT内容をデータセットにコピーして保管したい場合は、OSが提供する外部ライター(XWTR)というプログラムを利用できます。詳細はSYSOUTデータセットの取り出し(XWTR)を参照して下さい。またSDSFであれば表示中のSYSOUTを簡単にデータセットにコピーすることもできます。SYSOUTの選択パネルでNPフィールドにXDCを入力すれば、SDSF Open Print Data Set というパネルが出て、どこへ書き出すかを問い掛けてきます。SYSOUTの内容を表示中であれば、COMMAND INPUT ===>フィールドにPTコマンドを入力することでコピーできます。PTコマンドにはさまざまなパラメーターがありますので詳しくはヘルプ(HELP PTと入力)を見るかマニュアルを見て下さい。こちらのページ、SDSFで表示中のSYSOUTをデータセットに取り込むでも使い方例を解説しています。