多くのメインフレーム・システムでは、プログラムの実行結果は出力ファイルとして書き出されます。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つのプログラムがプリンターを使っていると、他のジョブ(プログラム)はその間、デバイスが空くまで待たなければなりません。用紙がなくなったり、ジャムったりした場合も、その復旧時間の間、実行中のプログラムも待っていなければなりません。他にも、行送りや改ページなど、プリンターの制御を行うにはハードウェアに依存した入出力処理が必要ですが、これらはユーザープログラムにとっては業務処理とは直接関係ありません。それらのようなことから、パフォーマンスとスループットの向上、ユーザープログラムの簡易化などの理由で、出力データをスプーリングという方式で制御しています。スプーリングはMVS(JES2)のみならず、ほとんどすべてのメインフレームOS(ジョブ入力サブシステム)で採用していますし、メインフレームOS以外の多くのオペレーティング・システムでも使われています。
SYSOUTへ出力
1 2 3 4 |
//STEP1 EXEC PGM=MYPROG1 //PROGOUT DD SYSOUT=A <-- ここがSYSOUTへの出力定義 //PROGIN DD DISP=SHR,DSN=INPUT.DATA1 // |
実は、プログラム自身は、SYSOUTに出力するとかDISKのデータセットに書き出すとかの意識は基本的にしません。特に、COBOLなどで作成されるアプリケーションプログラムやアセンブラー言語であっても一般のプログラムであれば、データを順次データセットとして書き出す、という処理さえ行えばよいようになっています。
実際のデータセットに書き出すのか、JES2のスプールに書き出すのかは、JCLで決まります。言い換えれば、JCLの定義を変えれば、プログラムをいじらなくても運用でデータの書き出し先を自由に変えることができるようになっています。
実際にJES2スプールにデータを書き出すのであれば、JCLのDDステートメントにSYSOUTパラメーターを定義します。SYSOUTには、クラスと呼ばれる区分けの識別子があり、JES2ではAからZ、0から9の36種類があります。どのクラスにどのような意味を持たせるかは、センターによって違います。例えば、Aクラスは高速なレーザー・プリンター、Bクラスはライン・インパクト・プリンター、Hクラスはスプール内に留め置かれるホールド・クラス、Wクラスはリモート印刷処理を行うためのソフトウェアで処理される、などです。開発作業で作成したCOBOLプログラムのコンパイル・ジョブの実行結果を、むやみに業務用帳票の印刷を行うプリンターから出力してしまうなどは、決してよいことではありません。SYSOUTパラメーターにどのクラスを指定するかは、必ずセンター規約を参照するか、システム管理者に確認することが大切です。なお、実行結果(SYSOUT)の確認を、TSO端末での表示だけで行い、印刷せずに消去してもかまわない場合は、ホールド・クラスを指定することが一般的です。MVSのSDSFで表示する場合は、必ずしもホールド・クラスである必要はありませんが、ホールド・クラスであればSDSF以外の、例えば、TSOのOUTPUTコマンドなどでも処理が可能になります。いずれにせよ、指定するSYSOUTクラスは、利用するセンターの規約で定められていますからそれに従います。
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をデータセットに取り込むでも使い方の例を解説しています。