ジョブの実行

本章では、実際にジョブを実行するランナーであるtjclrunの動作方式と機能について説明します。また、JCL解析、ジョブの実行とその結果について説明します。

1. 概要

ユーザーがサブミットしたジョブがスケジューラーによってスケジューリングされ、実際にオペレーティング・システム上で実行されることをジョブの実行といいます。ジョブは、tjclrunによって実行されます。

以下は、tjclrunによってジョブが実行される手順です。

  1. スケジューラーがサブミットされたジョブのジョブ・クラスと優先順位などのスケジュール・パラメータおよび現在のシステムで使用可能なランナー・スロットの状態をチェックして、特定のランナー・スロットにジョブを割り当て(スケジューリング)ます。

  2. ランナー・スロットは、tjclrunを実行するためのデータをジョブ・スプールに記録し、tjclrunを呼び出します。

  3. tjclrunは、ジョブ・スプールを介して渡されたジョブのJCLに従ってジョブを実行します。

  4. ジョブの実行が終了したら、tjclrunは自身を呼び出したランナー・スロットにジョブの実行結果をレポートします。

ジョブの実行結果は、TJESが管理するJOBQに格納されます。実行済みジョブの出力およびJOBQに格納されたジョブの情報は、TJESによって管理されます。ユーザーは、実行済みジョブの実行結果を確認または出力することが可能であり、特定のジョブ情報が不要になった場合は削除することができます。

本章では、ジョブを実行するtjclrunの動作と機能について説明します。関連のJCLステートメントや文法については、メインフレームの『JCL Reference Guide』を参照してください。

2. ジョブの実行

ジョブを実行するためにtjclrunが呼び出されると、tjclrunはいくつかの初期化を行った後、ジョブ・スプールを介して渡されたJCLを解析し、その結果に基づいてジョブを実行します。

tjclrunは、JCL記述に従ってジョブの各ジョブ・ステップを順に実行します。各ジョブ・ステップでは、データセットの割り当てやバッチ・アプリケーションの実行などが行われます。

EXEC文のPGMパラメータを使用してジョブ・ステップに指定されたバッチ・プログラムを実行し、その監視情報をTJESに定期的にレポートします。また、実行されたバッチ・プログラムにSYSINデータセットの内容を送信し、SYSOUTデータセットを受け取ってジョブ・スプールに記録します。バッチ・プログラムの実行が終了したら、その実行結果をTJESにレポートします。その後、ジョブ・ステップの終了状態に応じて次のジョブ・ステップへ進むか、例外に該当する場合はジョブの実行を中止します。

すべてのジョブ・ステップが終了すると、tjclrunは、ジョブの実行結果をTJESにレポートし、割り当てられたデータセットなどのリソースを解放した後終了します。

以下は、tjclrunがジョブの実行段階で行う各種の処理をまとめた表です。

ジョブ 段階

実行

実行の初期化

ジョブ・ストリームの解析

実行

EXEC PGM処理

EXEC PROC処理

リソース

DD処理

スペシャルDD

出力処理

ジョブ・スプール

制御と監視

ジョブ制御

ジョブ・レベルのレポート

ステップ・レベルのレポート

その他

セキュリティ(TACFサポート)

tjclrunの呼び出し(tjclrunコマンドの使用)

NICEによるPERFORM処理

2.1. 実行の初期化

ランナー・スロットまたはサブミッターによってランナーが呼び出される前に、以下の必須リソースを準備する必要があります。

  • JOBID

  • JOBQのジョブ・エントリ

  • ランナー・スロット

  • ジョブ・スプール(INPJCL)

以下は、初期化を実行する手順です。

  1. コマンドラインの引数

    ランナー・スロットは、tjclrunの呼び出し時に指定した引数(args)を解析し、ジョブIDや実行するJCLファイルの場所、その他のパラメータを受け取ります。

    デバッグなどの特別な場合は、シェルを介してtjclrunを実行できますが、一般的にはTJESのランナー・スロットを通じて実行します。TJESを介さずにtjclrunを実行した場合、そのジョブはTJESの管理対象から除外されるだけでなく、正常な手順で実行されない可能性があります。

  2. 環境設定の読み込み

    OpenFrame環境設定のtjclrunサブジェクトの各セクションとキーを読み込み、設定に適したtjclrunの実行方法を決定します。

  3. 実行アカウント

    ジョブの実行時に、tjclrunプロセスの所有者はTJES管理者のオペレーティング・システムのアカウントと同一です。つまり、オペレーティング・システムのobmというユーザー・アカウントでTJESシステムを起動した場合は、tjclrunプロセスと各ジョブ・ステップで実行されるバッチ・プログラムのユーザーIDもobmになります。

    ただし、OpenFrame環境設定のtjclrunサブジェクトのACCOUNTセクションのSETUIDキーの値をYESに設定すると、JCL JOB文のUSERに指定されたユーザーでtjclrunのプロセスを実行することができます。詳細については、 セキュリティsetuid root tjclrunを参照してください。

  4. SYSLIBの初期化

    tjclrunは、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションに設定されたディレクトリから、ジョブ・ステップに指定されたプログラムを検索します。SYSLIBセクションを設定していない場合は、ユーザーの環境変数に指定されたディレクトリからプログラムを検索します。JCLにJOBLIB DDまたはSTEPLIB DDが存在する場合は、SYSLIBよりJCLに記述されたJOBLIBおよびSTEPLIBが優先されます。

    一部のUNIXシステムでは、tjclrunにルート権限を付与して運用すると、環境変数が削除される問題が発生するため、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションを必ず設定する必要があります。設定しない場合は、tjclrunがJCLに指定されたプログラムの実行またはロードに失敗します。詳細については、 セキュリティsetuid root tjclrunを参照してください。

  5. SYSMSG DDのオープン

    tjclrunがジョブを実行する際に発生するエラーおよび詳細についての結果レポートは、ジョブ・スプールのSYSMSGに保存されます。tjclrunは、初期化段階からログ・メッセージを保存するためにSYSMSGを予め開いておきます。

    以下の場合にログがSYSMSGに保存されます。

    • tjclrunの内部エラーやシステム関数の失敗などの問題を分析するために使用されるtjclrunの内部ログ

      tjclrunの問題分析に使用するためのログを出力する場合は、OpenFrame環境設定のtjclrunサブジェクトのDEBUGセクションのPROFILEキーの値をYESに指定します。

    • OpenFrameライブラリから出力されるstderr

      OpenFrameライブラリから出力されるstderrは、OpenFrameの一般的なログ形式に従うため、SYSMSGとは出力形式が異なります。

  6. ジョブ開始のレポート

    tjclrunが指定されたジョブの実行を開始したことをTJESにレポートします。

  7. ジョブ・スプールのオープン

    ジョブの実行プロセスで使用されるジョブ・スプールを開きます。

    tjclrunサブジェクトの詳細については、OpenFrame Batch『環境設定ガイド』を参照してください。

2.2. 入力JCLの解析

tjclrunは、ジョブ・スプールを介して渡されたJCLファイル(INPJCL)を解析してジョブを実行します。

tjclrunによって実行されるJOB文が含まれた(ジョブ・スプールに格納された)JCLファイルをジョブ・ストリームといいます。

  • JCLプロシージャの解析

    tjclrunは、ジョブの実行中にJCLファイルを複数回解析します。

    JOB文が含まれたINPJCLファイルを解析して順に実行します。そのとき、JCLプロシージャが呼び出されると、そのJCLプロシージャを解析して実行します。プロシージャの実行が終了したら、INPJCLの実行を続行します。

  • JOBPARM PROCLIB

    tjclrunは、ジョブの実行中に解析が必要なJCLプロシージャをJCLLIB文に指定されたJCLライブラリ(ライブラリ、PDS)から検索します。

    また、JOBPARMコマンドのPROCLIBパラメータに指定されたddnameに該当するJCLライブラリからも、JCLプロシージャまたはINCLUDE JCLを検索します。これらのJCLライブラリから解析対象が見つからなかった場合は、最後にデフォルト・ディレクトリのSYS1.PROCLIBから検索します。このディレクトリからも見つからなかった場合は、ジョブを異常終了(FLUSH状態)で処理します。

    INPJCL(ジョブ・ストリーム)にJOBPARMコマンドが指定された場合、このコマンドのPROCLIBパラメータに指定されたddnameは、OpenFrame環境設定のtjesサブジェクトのPROCLIBセクションに設定されている必要があります。

  • INCLUDE

    INCLUDE文でインクルードするJCLも、上述したJCLLIB文またはJOBPARMコマンドのPROCLIBパラメータに指定されたJCLライブラリから検索します。

2.3. 実行プロセス

実行するジョブのINPJCL(ジョブ・ストリーム)を解析した後、tjclrunはJCLに記述された手順に従ってジョブ・ステップを実行します。

JCLのJOB文にRESTARTパラメータが指定されている場合、このパラメータで指定されたジョブ・ステップから実行します。

2.3.1. 実行手順

以下は、解析後のジョブの実行手順です。

  1. ロック・フェーズ(Lock phase)

    該当のジョブで使用されるデータセットにロックを設定するフェーズです。

  2. 実行フェーズ(Exec phase)

    実際にジョブ・ステップを順序どおり実行するフェーズです。

tjclrunは、INPJCLやJCLプロシージャを分析して、該当のジョブが使用するデータセット・リストを事前に取得します。そして、ジョブの実行前に当該データセットにロックを一括要求することにより、複数のジョブが同時に同一データセットを排他的に(exclusive)使用するときに発生するデッドロックを防止することができます。

ジョブで使用するデータセットへのロック要求が正常に実行されたら、ジョブの実行フェーズに進みます。実行フェーズは以下のように処理されます。

  • EXEC PGM STEP(プログラム・ステップ)

    処理するジョブ・ステップがバッチ・プログラムを実行する場合、指定されたバッチ・プログラムを実行します。tjclrunは、バッチ・プログラムを自身の子プロセスとして実行し、そのプログラムの実行が終了されるまで待ちます。バッチ・プログラムの終了を待っている間、バッチ・プログラムが実行したデータセット入出力統計などの情報を定期的にTJESにレポートします。

  • EXEC PROC STEP(プロシージャ・ステップ)

    処理するジョブ・ステップがJCLプロシージャを呼び出す場合、指定されたJCLプロシージャを解析し、その結果に基づいて該当のプロシージャを実行します。呼び出されたJCLプロシージャから別のJCLプロシージャを呼び出すこともできます。これをネストされたJCLプロシージャの呼び出しといいます。ネストされたJCLプロシージャは、最大15レベルまで呼び出すことができます。

    JCLプロシージャ・ステップの実行後、そのJCLプロシージャを呼び出した元のステップに戻り、その次のステップから続行します。

2.3.2. 条件実行

以下のように、ジョブ・ステップを条件付きで実行することができます。

  • EXEC COND

    前のジョブ・ステップの終了状態に応じて次のジョブ・ステップに進むか、あるいはスキップするかを決めます。このような条件付きのジョブ・ステップの実行は、EXEC文のCONDパラメータを使用して指定します。

  • JOB COND

    バッチ・プログラムが終了すると、プログラムの終了状態がJOB文のCOND(例外)を満たすかどうかをチェックします。JOB CONDを満たす場合は、ジョブ・ステップの実行を中止します。

    JOB文のCONDを満たさない場合は、次のジョブ・ステップを続行します。

  • IF-THEN/ELSE/ENDIF

    IF-THEN/ELSE/ENDIF文に記述された条件を評価し、それに基づいてジョブ・ステップを実行します。

2.4. EXECプログラム処理

tjclrunの最も重要な機能は、ユーザー指定のバッチ・プログラムを実行することであり、以下のようなプロセスで行われます。

2.4.1. EXEC COND

EXEC PGM STEPを実行する前にEXEC文に記述されたCONDパラメータを評価して、前のステップの実行結果がEXEC CONDを満たす場合(例外の場合)は、EXEC PGM STEPを実行せずにスキップします。

ジョブで実行される最初のジョブ・ステップは、常にEXEC CONDを満たさないものと評価されます。

EXEC CONDを満たさないジョブ・ステップ(EXEC PGM STEP)は、以下の手順で実行されます。

  1. ステップの進行状況をレポート

    EXEC PGM STEPの処理開始をTJESにレポートします。

  2. プログラムの実行権限

    EXEC PGMに指定されたバッチ・プログラムが主要なユーティリティである場合、それに対するジョブ・ユーザーの実行権限をチェックします。OpenFrame環境設定のtjclrunサブジェクト、TACFサブジェクトのCHECK_UTAUTHキーの値がYESに設定されている場合にのみ権限をチェックします。

  3. STEP DDの割り当て

    バッチ・プログラムが使用するデータセットを指定したDD文を処理してデータセットを割り当てます。特定のステップ内で同じDDが見つかった場合は、後に指定されたDDはtjclrunによって変更され、バッチ・プログラムで使用されないようにします。ジョブ・ステップ・レベルのスペシャルDD文に対する付加的な処理もこのステップで行われます。

    ジョブ・ステップ・レベルのスペシャルDD文には、STEPCAT DD文、STEPLIB DD文があります。

  4. プログラム・パラメータ

    EXEC PGMに指定されたバッチ・プログラムに渡される実行パラメータを作成します。バッチ・プログラムは、同パラメータをUNIXプログラムのargcまたはargvを使用して取得できます。

    プロシージャ・ステップに指定されたPARMが、呼び出されるJCLプロシージャ内に含まれたEXEC PGMのPARM値を上書きします。

  5. 呼び出しと実行

    システム関数を使用して、EXEC PGMに指定されたバッチ・プログラムを呼び出し(fork)ます。TJESでのバッチ・プログラムは、tjclrunプロセスの子プロセスとして実行されます。最初に呼び出し(fork)を実行して子プロセスを作成し、子プロセスでEXECを実行して指定されたバッチ・プログラムを開始します。

  6. SYSIN/SYSOUTパイプ

    OpenFrameでは、バッチ・プログラムが使用するSYSIN DDとSYSOUT DDをUNIXプログラムのstdinとstdoutとして実装しています。

    tjclrunは、シェルのコマンドラインを使用してバッチ・プログラムを実行するユーザーと同じ役割をします。tjclrunは、SYSIN DDの内容を読み込んでアプリケーションのstdinに書き込み、stdinからSYSINの内容を読み込むことができるようにします。

    また、tjclrunは、アプリケーションのstdoutの内容を読み込んで、SYSOUT DDに該当するデータセットまたはジョブ・スプールに出力します。

    SYSIN DDとSYSOUT DDをUNIXシステムのプログラムが共通して使用するstdinとstdoutにマッピングすることにより、OpenFrameのデータセットAPIを使用せずに作成されたUNIXアプリケーションを、OpenFrame Batchシステムで別途処理することなく、バッチ・プログラムとして実行することができます。

    1. UNIXアプリケーションのstderrは、SYSOUT DDにstdoutの内容と一緒に記録されます。stdoutとstderrは、アプリケーションの基本的な出力ストリームです。メインフレームにはstderrに該当するDDがないため、stderrをSYSOUT DDに一緒に保存しています。

    2. tjclrunは、JCLに記述されたSYSOUT DDとSYSPRINT DDをシノニムとして処理します。1つのジョブ・ステップにSYSOUT DDとSYSPRINT DDが両方とも指定された場合、SYSPRINT DDは無視され、SYSOUT DDのみ使用されます。

  7. 監視レポートと待機

    tjclrunは、EXEC PGMに指定されたバッチ・プログラムを実行し、終了を待ちながら定期的にアプリケーションで実行されたデータセットのI/O数をTJESにレポートします。

  8. STEP DDの後処理

    ジョブ・ステップで実行されたバッチ・プログラムが終了したら、その終了状態に応じてDD文のDISPパラメータに指定された後処理を行います。

    ジョブ・ステップで実行されたバッチ・プログラムが正常終了した場合は、Normal Dispositionに指定された後処理を、異常終了した場合は、Abnormal Dispositionに指定された後処理を行います。DISPのタイプには、PASS、KEEP、CATLG、UNCATLG、DELETEがあります。

2.4.2. JOB COND

バッチ・プログラムの終了時に返された終了状態(Exit status)がJOB CONDを満たすかどうかを評価し、満たす場合はジョブ・ステップを実行せずに終了します。プログラムの終了状態がJOB CONDを満たさない場合は、次のジョブ・ステップに進みます。

2.4.3. リターンコードのチェック

プログラムの終了状態がJOB CONDを満たす場合、tjclrunは実行したバッチ・プログラムの終了時に返されたリターンコードに応じて、該当のステップを正常として処理するか、あるいはエラーとして処理するかを決めます。正常と判断された場合は、後続するステップを実行し、エラーと判断された場合はそのステップを異常終了し、後続するステップのうち、STEP CONDの異常時に実行するように指定されたステップのみ実行します。異常終了の場合に実行させる条件には、EVENとONLYパラメータがあります。

リターンコードは、OpenFrame環境設定のrcサブジェクトに設定します。詳細については、OpenFrame Batch『環境設定ガイド』を参照してください。

2.5. EXEC PROC処理

EXEC PROCステップによってJCLプロシージャが呼び出された場合、tjclrunは指定されたJCLプロシージャを解析して実行します。そのプロシージャの最終ステップまで実行したら、次のジョブ・ステップを続行します。

JCLプロシージャは、プロシージャが定義された場所に応じて、次の2つに分けられます。

  • 入力ストリーム・プロシージャ(INSPROC)

    入力ストリーム・プロシージャは、そのプロシージャを呼び出すINPJCLにプロシージャの内容が定義されています。入力ストリーム・プロシージャはそのプロシージャが定義されているINPJCLでのみ呼び出すことができます。

  • カタログ・プロシージャ(CATPROC)

    カタログ・プロシージャは、JCLプロシージャをメンバーとして持つJCLライブラリに登録されているJCLプロシージャです。カタログ・プロシージャを呼び出す場合は、JCLライブラリに登録されているメンバー名をプロシージャに指定します。PROCLIBは頻繁に使用されるJCLプロシージャを集めたJCLライブラリです。カタログ・プロシージャは異なる複数のJCLから呼び出すことができます。

tjclrunは、最初にINPJCLからEXEC PROC文に指定されたプロシージャを検索し、見つからなかった場合はカタログ・プロシージャとみなして、JCLLIB文またはJOBPARMコマンドのPROCLIBパラメータに指定されたJCLライブラリから該当のプロシージャを検索します。

特定のJCLライブラリから指定されたプロシージャが見つかった場合は、残りのJCLライブラリからは検索しません。

JCLLIB文が存在しない場合のみJOBPARMコマンドのPROCLIBパラメータによって指定されたDDからプロシージャを検索します。(JCLLIB文が優先します)

JOBPARM PROCLIB=ddnameに指定できるddnameは、OpenFrame環境設定のtjesサブジェクトのPROCLIBセクションにキーとして設定されている必要があります。1つのddnameに複数のJCLライブラリ名を指定することができます。また、JCLLIBと同様に、複数のJCLライブラリの最初から順番に指定されたプロシージャを検索するように設定することができます。

  1. カタログ・プロシージャが見つかった場合、tjclrunは、カタログ・プロシージャを解析する前に、そのカタログ・プロシージャの内容をジョブ・スプールのCATPROC DDに保存します。これにより、ジョブの実行結果を確認したり、問題点を分析したりすることができます。

  2. 入力ストリーム・プロシージャ(INSPROC)は、INPJCLに含まれているため、別途保存しません。

  3. tjesサブジェクトの詳細については、OpenFrame Batch『環境設定ガイド』を参照してください。

2.6. DD処理

tjclrunは、JCLのDD文に記述されたデータセットをバッチ・プログラムが使用できるように割り当てます。一般的なバッチ・プログラムは自身が使用するデータセットを自ら割り当てるのではなく、JCL DD文に記述されたデータセットをtjclrunが割り当てるようにし、その結果を継承して使用します。

データセットの割り当ては、EXEC PGM STEPでバッチ・プログラムを実行する前に行われます。バッチ・プログラムの終了後には、tjclrunによって割り当てられたデータセットへの後処理が実行されます。割り当てられたデータセットは、ジョブの終了時(tjclrunの終了時)に解除されます。

データセットの割り当ては、DD文に記述されたデータセットの特性に応じて以下のように分けられます。

  • NORMALデータセット

    最も一般的なデータセットであり、割り当てるデータセット名がDSNAMEパラメータで指定された場合です。OpenFrameのデータセット割り当てモジュールを呼び出してデータセットを割り当てし、アプリケーションがそのデータセットを使用できるように、割り当て結果をアプリケーションに渡します。

  • SYSOUTデータセット

    DD文にSYSOUTパラメータが指定されたデータセットです。SYSOUTデータセットは、ジョブの実行結果として生成された出力データをジョブ・スプールに保存します。

    ddnameがSYSOUTの場合と、DD文にSYSOUTパラメータが指定されたデータセットは、異なるデータセットです。後者の方がSYSOUTデータセットであり、SYSOUT DDはDD名がSYSOUTである場合です。通常、SYSOUT DD SYSOUT=*形式でコーディングされるため、注意が必要です。

  • 一時データセット

    DD文のDSNAMEパラメータで指定されたデータセット名が「&&」で始まるか、またはDSNAMEパラメータが指定されていないSYSOUTデータセット以外のデータセットは一時データセットです。tjclrunは、内部的に一時データセットに一意の名前を与えます。一時データセットは、ジョブの実行時に生成され、ジョブが終了すると削除されます。

    tjclrunは、ユーザーが指定した一時データセット以外にも、いくつかの内部用の一時データセットを使用しています。以下はその例です。

    • 入力ストリーム・データセット

      INPJCL(ジョブ・ストリーム)に「DD *」または「DD DATA」形式で記述されたデータセットです。

      tjclrunは、入力ストリーム・データセットに内部用の名前を与えてジョブ・スプールに保存します。このデータセットは、一般的なデータセットと同様に割り当てられ、バッチ・プログラムによって使用されます。tjclrunは、ジョブ・スプールに一時的に保存された入力ストリーム・データセットがジョブの終了時に削除されるよう、一時データセットとして作成しています。

2.7. スペシャルDD

DD文は以下の形式でJCLにコーディングされます。

//ddname DD [parameters,...]

システムで特殊な用途で使用するために予約されたDD名を持つDD文をスペシャルDD文といいます。

特殊な用途で使用するために予約されたスペシャルDDのDD名を約束された用途以外で使用することはできません。

TJESは以下のようなスペシャルDDをサポートします。

  • SYSIN DD

    現行のジョブ・ステップにが指定されている場合、tjclrunはSYSIN DD文に指定されたデータセットの内容を読み込んで、tjclrunが実行したバッチ・アプリケーションのstdinに渡します。つまり、アプリケーションはSYSIN DDによって割り当てられたデータセットの内容をstdinから読み込むことができます。

  • SYSOUT DD/SYSPRINT DD

    現行のジョブ・ステップにSYSOUT DDまたはSYSPRINT DDが存在する場合、tjclrunが呼び出すバッチ・プログラムの代わりに、このDDが指定するデータセットを解放します。また、バッチ・プログラムがstdoutまたはstderrで出力する内容を読み込んで、バッチ・プログラムに代わってSYSOUT DDまたはSYSPRINT DDによって割り当てられたデータセットに出力します。これは、OpenFrameのデータセットI/O関数を使用せず、stdoutまたはstderrに直接メッセージを出力するほとんどのアプリケーションを、JCLで問題なく実行できるようにするためです。

    SYSOUT DDとSYSPRINT DDは同様の意味で取り扱います。2つのDDが両方存在する場合は、常にSYSOUT DDを使用し、SYSPRINT DDは使用しません。

  • JOBLIB DD/STEPLIB DD

    JOBLIB DDとSTEPLIB DDは、tjclrunがEXEC PGM=pgmnameに指定されたバッチ・アプリケーションを検索するPDSデータセット(ライブラリ・パス)を指定します。

    区分 説明

    JOBLIB DD

    JOBLIB DDはINPJCLのJOB文と最初のEXEC文の間に指定できます。また該当のジョブで呼び出されるプログラムを検索するPDS(ライブラリ)を指定します。DD文の連結(concatenation)機能を利用して、複数のPDSからプログラムを検索するように指定できます。

    STEPLIB DD

    該当のジョブ・ステップのEXEC文の次に位置し、ジョブ・ステップで呼び出すプログラムを検索するPDS(ライブラリ)を指定します。JOBLIBと同様に、DD文の連結機能を使用して、複数のPDSからプログラムを検索するように指定できます。STEPLIB DDが指定されている場合、ジョブ・ステップで呼び出すプログラムを、STEPLIB DDが指定するPDS(ライブラリ)から検索します。この場合、JOBLIB DDは使用されません。

    JOBLIB DDは、STEPLIB DDのないジョブ・ステップで使用されます。JOBLIB DDとSTEPLIB DDのいずれも指定していない場合は、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションに設定された場所から実行するバッチ・プログラムを検索します。

    JOBLIBやSTEPLIB DDの連結機能については、メインフレームの『JCL Reference Guide』を参照してください。

  • JOBCAT DD/STEPCAT DD

    JOBCAT DDとSTEPCAT DDは、ジョブやジョブ・ステップで使用するデータセット・カタログを指定します。両方ともDD文の連結(concatenation)機能を利用して複数のデータセット・カタログが指定できます。

    区分 説明

    JOBCAT DD

    ジョブ・ストリームのJOB文と最初のEXEC文の間にのみ指定できます。JOBCAT DDは該当のジョブで基本的に使用するデータセット・カタログを指定します。

    STEPCAT DD

    ジョブ・ステップのEXEC文の次に位置し、当該ジョブ・ステップで使用するデータセット・カタログを指定します。

    JOBCATとSTEPCATが両方指定されている場合は、STEPCATが使用されます。JOBCATのみ指定されたジョブ・ステップでは、JOBCATが使用されます。JOBCATとSTEPCATのいずれも指定されていない場合は、OpenFrameシステムのマスター・カタログが使用されます。

    JOBCATやSTEPCATが指定されている場合でも、指定されたカタログにデータセットがカタロギングされていない場合は、マスター・カタログからデータセットのカタログ情報を検索します。

2.8. 出力処理

JCL OUTPUT文は、ジョブ・スプールに作成されるSYSOUTデータセットの出力処理方法を設定または制御するためのJCL文です。SYSOUTデータセットを示すDD文は、1つ以上のOUTPUT文を参照して該当の出力の処理方法を指定できます。

OUTPUT文に指定できる大部分のパラメータは、OUTPUT文を使用せずに直接SYSOUTデータセットを示すDD文に指定することもできます。ただし、DD文には固有の用途があり、また複数のDDに重複してコーディングすることを避けるために、OUTPUT文を使用して出力制御を行うことを推奨します。OUTPUT文には指定できるが、SYSOUT DD文には指定できないパラメータもあります。

2.9. ジョブ・スプール

tjclrunは、ジョブの実行中にさまざまな目的でジョブ・スプールを使用します。

以下は、tjclrunがジョブ・スプールに作成するデータセットについての説明です。

  • INPJCL

    tjclrunが実行するジョブ・ストリームが含まれているJCLファイルです。

    ほとんどのジョブ・スプール・ファイルはtjclrunによって作成されますが、INPJCLは、tjclrunがジョブをサブミットする際に使用できるように、TJESのSUBMITTER(obmjmsvr)によって事前にジョブ・スプールに作成されます。INPJCLの内容は、ユーザーがサブミットしたJCLファイルの内容と同じです。

  • CATPROC

    tjclrunがジョブを実行する際、カタログ・プロシージャを処理するときに使用したカタログ・プロシージャの内容を保存するスプール・データセットです。

    1つのジョブが複数のカタログ・プロシージャを呼び出すことができるため、CATPROCにはジョブが使用した複数のカタログ・プロシージャの内容が保存されます。これらのカタログ・プロシージャは、tjclrunによって実行された順にCATPROCに保存され、カタログ・プロシージャが呼び出されたジョブ・ステップを示すメッセージが各プロシージャの先頭に追加されます。

  • INSDSET

    INPJCLに以下の形式で記述されている入力ストリーム・データセットをtjclrunが内部で使用ためにジョブ・スプールに作成する一時データセットです。

    以下は、入力ストリーム・データセットの設定例です。

    //ddname DD *
     line1
     line2
     ...
     lineN
    /*

    上記例の場合、INSDSETは、line1、line2、…​、lineNを内容とする一時データセットであり、当該DDを使用するジョブ・ステップで生成され、ジョブ・ステップの終了時に削除されます。このようなルーチンをINSDSET SHUNTと呼びます。

    一時データセットのレコード長は、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションのINSDSET_LRECLキーの設定に従います。この値は、1から4096まで指定することが可能であり、未指定時のデフォルト値は80です。入力ストリームがレコードの長さより小さい場合はスペースで埋められ、大きい場合は余分な部分が捨てられます。

    1. 入力ストリーム・データセットは、非VSAMデータセットと連結されることがあるため、INPJCLから入力ストリーム・データセットを抽出してデータセットとしてシャント(SHUNT)しておくと、非VSAM SDSの連結ロジックを使用して一貫した方式で連結を処理することができます。そのため、tjclrunがINSDSET SHUNTを実行しています。

    2. INSDSET_LRECLの設定については、OpenFrame Batch『環境設定ガイド』の「INSDSET_LRECL」を参照してください。

  • JESJCL

    tjclrunがINPJCL、INSPROC、およびカタログ・プロシージャを解析した結果であるパース・ツリーのテキスト形式で出力したファイルです。問題を分析する際に使用されます。

  • JESMSG

    tjclrunを実行したランナー・スロットがtjclrunの終了時に該当のジョブ・スプールに記録するデータセットです。実行されたジョブの基本情報とジョブの実行時にレポートされたさまざまな統計情報、そしてジョブ・ステップに関する情報が含まれます。また、TJESシステムにとって重要なジョブ実行に関連する要約情報も含まれています。

  • SYSMSG

    SYSMSGは、tjclrunの主要メッセージ・ログです。SYSMSGには、ジョブの実行に必要な下位レベルの進行状況や重要な結果メッセージだけでなく、ジョブの処理時に発生したエラー・メッセージも保存されます。

    ジョブの実行が異常終了した場合は、原因を分析するために最初にSYSMSGの内容を検討します。SYSMSGの内容は、tjclrunがジョブ・ステップを実行した順に時間順で表示されます。

    以下は、SYSMSGに表示される内容です。

    • 実行中のジョブ・ステップ名

    • ジョブの実行中に割り当てられたデータセットの情報

    • tjclrunが呼び出したPGM名とプロセスID(pid)

    • tjclrunが呼び出したPGMの終了状態

    • tjclrunが現在実行中の動作

    • tjclrunの主な動作の成功の可否

    • tjclrun内のOpenFrameライブラリのstderrメッセージ

  • SYSOUT

    SYSOUTデータセットは、以下のようにDD文にSYSOUTパラメータが指定された場合です。SYSOUTデータセットは、他のデータセットとは違ってジョブ・スプールに保存され、一般的に出力データを保存します。

    以下は、SYSOUTデータセットの設定例です。

    //REPORT EXEC PGM=MONTHLY
    //SYSIN    DD *
    2007-07-01,2007-08-01
    /*
    //SYSOUT   DD SYSOUT=*
    //RPTOUT   DD SYSOUT=*
    //RPTERR   DD SYSOUT=*

    上述した他のジョブ・スプールのデータセットは、TJESがジョブを効率的に実行するために使用するデータセットであるのに対し、SYSOUTデータセットは、ユーザーがバッチ・プログラムのために特別に指定してジョブ・スプールに保存させたデータセットであると考えられます。

    SYSOUTデータセットは、1つのジョブまたはジョブ・ステップ内で複数指定することができます。上記の例では、SYSOUT、RPTOUT、RPTERRがSYSOUTデータセットに該当します。SYSOUT データセットの内容は、ユーザーが指定したバッチ・プログラムによって出力されたデータです。

    TJESは、SYSOUTデータセットに対して、それ以外の情報を追加・変更することはありません。バッチ・プログラムがSYSOUTデータセットの使用を終了すると、TJESはそのデータセットに指定されたOUTPUT CLASSに従って、出力された内容を後でプリンターや画面に出力する処理を管理するだけです。

2.10. ジョブ制御

TJESでは、スケジューリングの後、実行中のジョブをSUSPEND(一時停止)、RESUME(再開)、STOP(強制終了)することができます。

TJESでは、ジョブを実行するための複数のサブプロセスに対する制御をジョブ制御といいます。tjesmgrまたはOpenFrame Manager[Batch]メニューなどのユーザー・インターフェースを使用して実行中のジョブを制御することができます。

ジョブ制御コマンドの使用方法については、TJESMGRコマンドおよびOpenFrame Manager『ユーザーガイド』を参照してください。

実行中のジョブに対してジョブ制御コマンドを入力すると、以下の手順で処理されます。

  1. TJESがtjclrunにジョブを制御するためのシグナル(SIGUSR1)を送信します。

  2. tjclrunは、受信したSIGUSR1に含まれている情報を参照して、要求された動作(SUSPEND/RESUME/STOP)を把握します。

  3. UNIXシステムのジョブ制御シグナル(SIGSTOP/SIGCONT/SIGKILL)を、tjclrunがジョブ・ステップで実行したサブプロセスに送信します。

  4. サブプロセスは、受信したシグナルに応じて一時停止、再開、または強制終了されます。

  5. tjclrunは、サブプログラムに対してジョブ制御を実行した後、その結果をTJESにレポートします。

  6. tjclrunは、要求された動作がSUSPENDの場合は、自分自身にSIGSTOPを送信して実行を一時停止し、STOPの場合は実行を終了(exit)します。また、RESUMEの場合は、TJESからtjclrunにSIGCONTを送信して、tjclrunの実行を再開します。実行が再開されたtjclrunは、自身が実行したサブプロセスにSIGCONTを送信します。

tjclrunのジョブ制御は、UNIXシステムのジョブ制御シグナル(SIGSTOP/SIGCONT/SIGKILL)を使用して実装されているため、プロセスの実効ユーザーIDが異なると、サブプロセスにシグナルを送信する際、権限問題によってエラーが発生することがあります。したがって、ジョブ制御を正常に実行するには、tjclrunにroot権限を付与する必要があります。詳細については、セキュリティsetuid root tjclrunを参照してください。

2.11. ジョブ・レベルのレポート

tjclrunは、ジョブの実行情報をTJESにレポートします。レポートの内容は、ジョブの全般的な情報と特定のジョブ・ステップ情報に分けられます。

以下は、tjclrunがTJESにレポートする情報です。

  • ジョブの開始と終了

    tjclrunがジョブの実行を開始および終了したことをTJESにレポートします。ジョブ終了のレポートには、ジョブの実行が正常に終了したかどうかを示す終了状態と終了コードが含まれます。

  • ジョブ制御の状態

    TJESは、tjclrunが実行しているジョブをSUSPEND/RESUME/STOPさせることができます。tjclrunは、要求されたジョブ制御を実行した後、ジョブの状態をTJESにレポートします。

  • データセットのロック待機

    tjclrunは、ジョブを実行する前にそのジョブで使用されるデータセットのロックを要求します。

    tjclrunは、ロックを要求したデータセットが他のジョブによってすでにロックされ、使用されている場合、ジョブを処理せずにロックが成功するまで待機します。そのとき、問題の原因となるジョブとロック要求を待っているデータセットをTJESにレポートします。管理者は、レポート情報を検討して、複数のジョブ間でデータセットが共有され、ジョブの処理が遅延される問題を解決することができます。

2.12. ステップ・レベルのレポート

以下は、tjclrunのジョブ・ステップ・レベルのレポート情報です。

  • ステップの開始と終了

    tjclrunは、ジョブを構成する各ジョブ・ステップ処理の開始と終了をTJESにレポートしています。

    STEP STARTは、現在実行中のジョブ・ステップのパス(ジョブ・ストリームでのロケーション)情報と、ジョブ・ステップのタイプ(PGMまたはPROC)などをレポートします。また、STEP FINISHは、ジョブ・ステップの終了状態、終了コード、実行時間などをレポートします。

  • データセットの割り当て

    tjclrunは、ジョブ・ステップに指定されたバッチ・プログラムを呼び出す前に、バッチ・プログラムが使用するデータセットを事前に割り当てます(割り当てられるデータセットはJCLのDD文によって指定されます)。

    データセットの割り当て情報は、OpenFrameシステムにおいて非常に重要な情報であるため、tjclrunによって割り当てられたddnameとデータセット名は、ジョブ・スプールのSYSMSGとOpenFrame_HOME/log/sysディレクトリのdsalcログに記録されます。

  • データセット入出力のレポート

    バッチ・プログラムによって使用および変更されたデータセットの入出力情報が反映します。

    tjclrunは、バッチ・プログラムの実行中に行われたデータセットの入出力統計情報をTJESに定期的にレポートします。管理者(ユーザー)は、特定のデータセットに対してジョブ・ステップごとに実行された読み書きを監視することができます。

2.13. セキュリティ

2.13.1. TACFのサポート機能

tjclrunは以下の2つのTACFセキュリティ機能をサポートします。

  1. ジョブ・ステップのEXEC PGMに指定されているプログラムに対し、実行権限があるかどうかをチェックする機能です。

  2. DD文に指定されているデータセットに対し、アクセス権限があるかどうかをチェックする機能です。

いずれの場合も、権限がない場合はジョブの実行は異常終了します。

TACFを利用して、特定のTACFユーザーに対してプログラムやデータセットに対する権限を制御する方法については、OpenFrame TACF『管理者ガイド』を参照してください。

2.13.2. TACFの代理ユーザー

ジョブを特定のユーザー権限で実行するために、JCLのJOB文にUSERとPASSWORDパラメータを指定します。そのとき、JCL JOB文のパスワードを暗号化せずに指定するため、JCLファイルを管理する環境によっては、ユーザー・パスワードが公開される恐れがあります。

このようなリスクを防ぐために、TJESでは代理ユーザー(Surrogate User)として指定されたユーザーが、実行ユーザー(Execution User)に代わって、パスワードを指定せずに実行ユーザー権限でジョブをサブミットすることができます。

代理ユーザーが実行ユーザーに代わってジョブをサブミットする場合にも、ジョブは実行ユーザー権限で実行されます。代理ユーザーは、実行ユーザーに代わってジョブをサブミットするだけです。代理ユーザーによるジョブのサブミットは、JCLのJOB文にPASSWORDパラメータが指定されていない場合にのみ有効です。

TACFでジョブを実行するために代理ユーザーを指定する方法は、OpenFrame TACF『管理者ガイド』を参照してください。

2.13.3. setuid root tjclrun

setuidは、UNIXシステムで実行プログラムを実行するユーザーではなく、プログラム・ファイルの所有者権限でプログラムを実行するために、実行プログラムの所有者とファイルの権限を適切に変更して設定することです。setuidされたプログラムであっても、実行ユーザーにプログラムへの実行権限がある場合にのみ実行できます。setuid rootは、プログラムを実行ユーザーではなく、rootユーザー権限でプログラムを実行することです。

プロセスのユーザーとは、UNIXプロセスの実効ユーザーIDを意味します。tjclrunは、プロセスが実行される間は、tjclrun.confの設定に関係なく、プロセスの実際のユーザー情報(real userid)を変更しません。UNIXシステムにおけるファイルとシステム・リソースへの権限チェックは、プロセスの実効ユーザーに対して行われます。

ユーザー情報は、プロセスを呼び出したユーザー(オペレーティング・システム・ユーザー)を識別するために使用されます。

以下の2つの事項を考慮して、OpenFrame TJESのインストール後にtjclrunプログラムにルート実行権限を付与するかどうかを決めます。

  1. tjclrunによって実行されたバッチ・プログラムがtjclrunを実行したプロセスとは異なる有効ユーザーで実行されると、tjclrunはUNIXのジョブ制御シグナルを使用する際に権限不足のため正常にジョブ制御を行うことができません。このような状況でも正常にジョブ制御を行うためには、tjclrunプログラムにroot権限で実行できる権限を付与することを考慮する必要があります。

    また、管理者がrootユーザーとしてログインし、該当のプロセスに対してジョブ制御シグナルを送信することもできますが、このような作業は時間と手間がかかるため、管理者の負担を増やす要因となります。

    このような問題は、tjclrunによって実行されるバッチ・プログラムに対し、tjclrunプロセスの実効ユーザーではなく、別のユーザーでsetuidされた場合に発生します。

  2. ジョブを実行するtjclrunおよびジョブ・ステップで実行されるバッチ・プログラムを実行するプロセスをジョブに指定されたユーザー権限で実行するには、OpenFrame環境設定のtjclrunサブジェクトのACCOUNTセクションのSETUIDキーのVALUE項目をYESに設定し、tjclrunプログラムのインストール時にroot実行権限を付与する必要があります。

    UNIXオペレーティング・システムで、プログラムの実行中にプロセスを実行するユーザー情報を変更するには、rootユーザー権限が必要であるからです。

    このような制約を避けるために、TJESシステムをroot権限で運用するのも1つの方法ですが、システムのセキュリティおよび管理上の理由でroot権限で運用することはお勧めしていません。その代わり、tjclrunプログラムにsetuid rootを設定すると、tjclrunプログラムの実行ユーザーがrootユーザーでなくても、tjclrunプログラム・ファイルの所有者(root)権限で実行されます。

以下は、setuid rootの設定例です。

$ cd $OPENFRAME_HOME/bin
$ su
$ chown 0:0 tjclrun
$ chmod u+s tjclrun
$ ls -l tjclrun
-rwsr-xr--x   root   system   {size}   {date-time}   tjclrun
$ exit

ファイル・パーミッションが-rwsr-xr- -xであり、所有者がrootに変更されたことを確認します。

詳細については、UNIXガイドの「man chmod」および「man chown」を参照してください。

プログラムが実行された直後のtjclrunはroot権限を持っているため、JCLに指定されたユーザー権限でプロセス・ユーザーを変更することができます。tjclrunは、実行初期の制限されたジョブのみroot権限で実行し、それ以外はJCLに指定されたユーザー権限で実行します。

ジョブのプロセス・アカウントやSTOPなどのジョブ制御を使用しない場合は、tjclrunプログラムに対するsetuidとtjclrun環境設定のsetuid設定は不要です。

IBM AIXの場合、setuid rootが設定されたプログラムを実行するとき、セキュリティ上の理由で共有ライブラリを検索するときに使用する環境変数のLIBPATHが削除されるため、tjclrunが使用するOpenFrame製品の共有ライブラリをロードできない問題が発生します。

この問題は、tjclrunプログラムを使用環境に直接インストールした後、再リンクして解決することができます。これにより、環境変数のLIBPATHに依存せず、リンクを実行するときに検索されたディレクトリから必要な共有ライブラリを見つけることができます。これは、IBM AIXオペレーティング・システムで、外部のユーザーによって変更された共有ライブラリがroot権限を持つプロセスで使用されることを防ぐためのオペレーティング・システム上のポリシーです。

以下は、IBM AIXでtjclrunを再リンクする例です。

$ cd $OPENFRAME_HOME/bin
$ cp tjclrun tjclrun.bak
$ cc -q64 -brtl -o tjclrun.new ¥
> ./tjclrun ¥
> -L$OPENFRAME_HOME/lib -L$TB_HOME/client/lib -L$TMAXDIR/lib64 ¥
> -ljcl -licf -ldsio -lspool -ltjes -ljmcliout -lsms -lsaf ¥
> -ldsalc -lpgmdd -lams -lbinfmt -lofcom -llockm -lcli
$ cp tjclrun.new tjclrun

OpenFrameのユーザー環境で再リンクを実行した後は、setuid rootを設定します。再リンク時に一緒にリンクするライブラリは(上記例の-ljclから-lcliまで)、ldd tjclrunコマンドによって表示されるOpenFrame製品に含まれているtjclrunが使用するライブラリです。

  1. 他のUNIXプラットフォームの場合(Linux)は、ld.so.confファイルなど、trustedライブラリを登録する設定により、共有ライブラリの検索環境変数に依存せず、OpenFrame製品が提供するライブラリを検索することができます。

  2. tjclrunをsetuid root権限でインストールして運用する場合は、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションのLIB_PATH、BIN_PATHキーを設定する必要があります。特に、IBM AIXのようなシステムでは必須設定です。それ以外の場合にも、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションに設定されたパスからのみプログラムや共有ライブラリを検索できるようにするのが、セキュリティやシステムのパフォーマンスの面でメリットがあります。ただし、OpenFrameの設定を変更する権限は厳しく管理する必要があります。

2.14. tjclrunの呼び出し

tjclrunは、実行引数と一緒に実行される必要があります。

TJESのランナー・スロットは、ジョブの実行が割り当てられた時点のTJESの状態に基づいて、適切な実行引数と一緒に実行されます。

tjclrun RUNMODE JOBID INITINDEX JOBSTREAM JOBPOS [keyword args ...]

以下は、tjclrunの引数についての説明です。

引数 説明

RUNMODE

ジョブ(normal run)またはJEM(JOB Emulation)テスト

JOBID

一意のジョブID(例:JOBnnnnn)

INITINDEX

ランナー・スロット・インデックス

JOBSTREAM

JCL文を含むジョブ・ストリームのパス

JOBPOS

ジョブ・ストリーム内に複数のジョブが存在する場合、実行するジョブの位置

  • [keyword args]

    RESTART=*|stepname|stepname.procstepname

    再開するジョブ・ステップを指定します。アスタリスク(*)は最初のジョブまたはプロシージャ・ステップを表します。stepnameはジョブ・ステップ名、stepname.procstepnameはジョブ・ステップのプロシージャ・ステップを表します。

tjclrunをシェルのコマンドラインで直接実行することも可能です。ただし、この場合、サブミットやスケジューリングなどのジョブ管理段階がスキップされるため、正常なジョブ実行が保証されません。

2.15. NICEによるPERFORM処理

メインフレームでは、JCLのJOB文とSTEP文に存在するPERFORMパラメータを使用して、ジョブまたはジョブ・ステップのパフォーマンス・グループを指定し、それらの優先順位を調整しています。

ただしUNIXでは、パフォーマンス・グループは存在しておらず、プロセス・ベースのNICE機能を使用してCPUの優先順位を調整しています。OpenFrameでは、PERFORMパラメータとNICE機能をマッピングしてサポートしています。

OpenFrameでPERFORMパラメータの使用やPERFORM値とNICE値のマッピングを設定することができます。OpenFrame環境設定のtjclrunサブジェクトのPERFORMセクションにキーとして設定します。詳細については、OpenFrame Batch『環境設定ガイド』を参照してください。

  1. UNIXにてプロセスのNICE値を変更するには、スーパー・ユーザー権限が必要です。そのため、PERFORMを使用する場合には、setuid機能を一緒に使用する必要があります。

  2. NICE値を変更することによって、CPU使用の優先順位を上げることができます。これは、CPU使用時間が長いジョブには有効ですが、I/O処理時間が長いジョブにはほとんど効果がありません。