ジョブの実行
本章では、実際にジョブを実行するランナーである「tjclrun」およびJCL解析、ジョブの実行と結果について説明します。
1. 概要
ジョブの実行(JOB Execution)は、TJESが提供するバッチ・ジョブを管理および処理するためのステップであり、ユーザーがサブミットしたジョブがスケジューラーによってスケジューリングされ、実際にOS上で実行されます。ジョブは、tjclrunによって実行されます。
以下は、tjclrunによってジョブが実行される手順です。
-
スケジューラーからサブミットされたジョブのジョブ・グループと優先順位などのスケジューリング・パラメータと現在のシステムで使用できるランナー・スロットの状態に応じて特定のランナー・スロットにジョブを実行するように割り当て(スケジューリング)ます。
-
ランナー・スロットは、tjclrunを実行するためのデータをジョブ・スプールに記録し、tjclrunを呼び出します。
-
tjclrunは、ジョブ・スプールを通じて渡されたジョブのJCLの内容に基づいてジョブを実行します。
-
ジョブの実行が終了すると、tjclrunは自分が呼び出したランナー・スロットにジョブの実行結果を返します。
ジョブの実行結果は、TJESが管理するJOBQに格納されます。また、実行済みジョブの出力およびJOBQに格納されているジョブ情報は、TJESによって管理されます。ユーザーは、実行済みジョブの実行結果を確認および出力するか、不要なジョブ情報を削除することができます。
本書では、ジョブを実行するtjclrunの動作と機能について説明しており、JCL文や文法については説明していません。詳細については、メインフレームの『JCL Reference Guide』を参照してください。 |
2. ジョブの実行手順
TJESのジョブ処理ステップでtjclrunが呼び出されると、tjclrunはジョブを実行するためのいくつかの初期化を行い、ジョブ・スプールを介して渡されたJCLを解析してその結果に応じてジョブを実行します。
tjclrunは、ジョブを構成するジョブ・ステップをJCLの内容に従って実行します。各ジョブ・ステップで使用されるデータセットの割り当てやユーザー指定のバッチ・アプリケーションの実行など、複数の詳細ステップで構成されています。
EX文に記述したプログラムを使用して、ジョブ・ステップに指定されたバッチ・プログラムを実行します。実行中には、プログラムの実行に関する監視情報を定義的にTJESにレポートします。また、実行したバッチ・プログラムにSYSINデータセットの内容を送信し、SYSOUTデータセットを受け取ってジョブ・スプールに記録します。実行したバッチ・プログラムが終了すると、その終了結果をTJESにレポートします。ジョブ・ステップの終了状態に応じて、その次のジョブ・ステップを実行するか、例外条件が満たされる場合はジョブの実行を中断します。
上記の方法でJCLに記述されているすべてのジョブ・ステップの実行が終了したら、tjclrunはジョブの実行結果をTJESにレポートし、ジョブの実行時に割り当てられたデータセットなどのリソースを返して終了します。
以下は、tjclrunがジョブを実行する手順です。
実行ステップ | 詳細ステップ |
---|---|
実行 |
|
リソース |
|
制御/監視 |
|
その他 |
|
2.1. 実行の初期化
以下は、ランナー・スロットまたはSUBMITORなどによってランナーが呼び出される前に準備が必要なリソースです。
-
JOBID
-
JOBQ上のジョブ・エントリ
-
ランナー・スロット
-
ジョブ・スプール(EXPJCL)
実行の初期化は、以下の手順で行われます。
-
コマンドライン引数のチェック
ランナー・スロットは、tjclrunの呼び出し時に指定した引数(args)をチェックし、ジョブIDや実行するJCLファイルの場所およびその他の処理パラメータを取得します。
デバッグなどの特殊な場合はシェルを使用してtjclrunを実行できますが、一般的にはTJESのランナー・スロットを通じて実行されます。TJESを使用せずにtjclrunを実行した場合は、TJESのジョブ管理対象から除外されるだけでなく、正常に実行されない場合があります。
-
環境設定の読み込み
OpenFrame環境設定のtjclrunサブジェクトの各セクションとキーを読み込んで、tjclrunの実行方式を決定します。
-
実行アカウント
ジョブの実行時、tjclrunプロセスの所有者はTJES管理者のOSアカウントと同じです。つまり、TJESシステムをOS上の「obm」というユーザー・アカウントで起動した場合、tjclrunプロセスと各ジョブ・ステップで実行されるバッチ・プログラムのユーザーIDも「obm」になります。
ただし、OpenFrame環境設定のtjclrunサブジェクトのACCOUNTセクションのSETUIDキーのVALUE項目をYESに設定すると、JCL USER文に指定されたユーザーでtjclrunを実行することができます。詳細については、セキュリティの「setuid root tjclrun」を参照してください。
-
SYSLIBの初期化
tjclrunは、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションに設定されたディレクトリからジョブ・ステップに指定されたプログラムを検索します。SYSLIBセクションを設定していない場合は、ユーザーの環境変数に指定されたディレクトリから検索します。
JCLにPRGLIB FDが存在する場合は、SYSLIBよりもJCLのPRGLIBが優先されます。
-
実行の優先順位
-
PRGLIB FDが存在する場合、PRGLIBのパスにあるプログラム
-
PRGLIB FDが存在しない場合、tjclrun設定のSYSLIBセクションのパスにあるプログラム
-
PRGLIB FDが存在せず、tjclrun設定のSYSLIBセクションの設定もない場合は、ユーザー環境変数(PATH)に指定されたパスのプログラム
-
一部のUNIXシステムでtjclrunにルート権限を付与して運用する場合、環境変数が削除される問題があるため、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションを設定する必要があります。そうでないと、tjclrunは、JCLに記述されたプログラムを実行するか、tjclrunのロードに失敗することになります。詳細については、セキュリティの「setuid root tjclrun」を参照してください。
-
-
ジョブ開始のレポート
tjclrunが指定されたジョブの実行を開始したことをTJESにレポートします。
-
ジョブ・スプールのオープン
ジョブの実行で使用するためにジョブ・スプールをオープンします。
tjclrunサブジェクトの詳細については、OpenFrame Batch『環境設定ガイド』を参照してください。 |
2.2. JCLの解析
tjclrunは、ジョブ・スプールを介して渡されたJCLファイル(EXPJCL)を解析してジョブを実行します。
tjclrunが実行するJOB文を含む(ジョブ・スプールに格納されている)JCLファイルをジョブ・ストリームといいます。 |
2.3. 実行
実行するジョブのEXPJCL(ジョブ・ストリーム)を解析した後、tjclrunはJCLの内容に従ってジョブ・ステップを実行します。
2.3.1. 実行フェーズ
以下は、解析後のジョブの実行フェーズです。
-
ロック・フェーズ
ジョブで使用されるデータセットにロックを設定します。
-
実行フェーズ
実際にジョブ・ステップを実行します。
tjclrunは、EXPJCLを分析してジョブで使用されるデータセット・リストを事前に取得し、ジョブを実行する前にそのデータセットへのロックを要求します。異なる複数のジョブが同時に同じデータセットを排他的に使用する場合に発生するデッドロックを防ぐためです。
ジョブで使用するデータセットが正常にロックされると、ジョブの実行が開始されます。実行フェーズは、以下のように処理されます。
-
EX PGMステップ
処理するジョブ・ステップがバッチ・プログラムを実行する場合(EX文)、指定されたバッチ・プログラムを実行します。tjclrunは、バッチ・プログラムを自分の子プロセスとして実行し、そのプログラムの実行が終了するまで待ちます。その間、バッチ・プログラムが実行したデータセットの入出力統計などの情報をTJESに定期的にレポートします。
2.4. EXプログラムの処理
tjclrunの最も重要な機能は、ユーザー指定のプログラムを実行することです。バッチ・プログラムは、以下の手順で実行されます。
2.4.1. EX COND
EX PGMステップを実行する前に、EX文のCONDパラメータを評価し、前のステップの実行結果がEX CONDを満たしていない場合(例外状況の場合)は、そのEX PGMステップをスキップします。ジョブで実行される最初のジョブ・ステップは、常にEX CONDを満たすものと評価されます。
EX CONDを満たす場合は、そのジョブ・ステップ(EX PGMステップ)を以下の手順で実行します。.
-
ステップの進行状況のレポート
EX PGMステップの処理開始をTJESにレポートします。
-
STEP FDの割り当て
EX PGMステップで呼び出すバッチ・プログラムが使用するデータセットを指定するFD文を処理してデータセットを割り当てます。ジョブ・ステップ・レベルのスペシャルFD文もこのフェーズで処理されます。ジョブ・ステップ・レベルのスペシャルFD文には、STEPCAT FD文とPRGLIB FD文があります。
-
PARA文の処理
ステップにPARA文が存在する場合、EX文に指定されたバッチ・プログラムに渡される実行パラメータを作成します。バッチ・プログラムは、このパラメータを一般的なUNIXプログラムのargcまたはargvを使用して取得できます。
-
呼び出しと実行
システム関数を使用してEX文に指定されているバッチ・プログラムを呼び出し(fork)ます。TJESでのバッチ・プログラムは、tjclrunプロセスの子プロセスとして実行されるため、forkを実行して子プロセスを作成し、子プロセスでAIMユーティリティのOSAMFRUN(共有オブジェクト)を実行してバッチ・プログラムを開始するか、そのプログラムを直接実行します。
-
SYSIN/SYSOUTパイプ
OpenFrameでは、バッチ・プログラムが使用するSYSIN(入力)FDとSYSOUT(出力)FDを一般的なUNIXプログラムのstdinとstdoutで実装しています。
tjclrunは、シェルのコマンドラインを使用してバッチ・プログラムを実行する機能をサポートしています。つまり、tjclrunは、SYSIN FDの内容を読み込んでアプリケーションのstdinに書き込み、アプリケーションのstdinからSYSINの内容の読み込みをサポートします。
また、アプリケーションがstdoutで出力した内容をtjclrunが読み込み、SYSOUT FDに対応するデータセットまたはジョブ・スプールに出力します。
SYSIN FDとSYSOUT FDをUNIXシステム上のプログラムが共通して使用するstdinとstdoutに関連付けることで、OpenFrameのデータセットAPIを使用せずに作成されたほとんどのUNIXアプリケーションも、OpenFrame Batchで別途処理することなく、バッチ・プログラムを実行することができます。
UNIXアプリケーションのstderrは、SYSOUT FDにstdoutの内容と一緒に記録されます。stdoutとstderrは両方ともアプリケーションの基本的な出力ストリームであり、メインフレームにはstderrに対応するFDがないため、stderrをSYSOUT FDに保存しています。
-
監視レポートと待機
tjclrunは、EX文に指定されていたバッチ・プログラムを実行し、そのプログラムが終了するまで待機しながら、アプリケーションで実行されたデータセットの入出力数を定期的にTJESにレポートします。
-
STEP FDの後処理
ジョブ・ステップで実行されたバッチ・プログラムが終了したら、その終了状態に応じてFD文のDISPパラメータに指定された後処理を行います。DISPには、CONT、LOCK、DLT、CAT、UNCAT、KEEPなどがあります。
2.5. FD処理
tjclrunは、JCLのFD文に記述されたバッチ・プログラムが使用するデータセットを割り当てて、バッチ・プログラムで使用できるようにします。一般的なバッチ・プログラムは自分が使用するデータセットを直接割り当てるのではなく、JCLにFD文を記述してtjclrunが割り当てるようにし、その結果を継承して使用します。
データセットの割り当ては、EX PGMステップでバッチ・プログラムを実行する前に行われます。バッチ・プログラムの終了後には、割り当てられたデータセットの後処理は、tjclrunによって実行されます。割り当てられたデータセットは、ジョブの終了時(tjclrunの終了時)に割り当てが解除されます。
データセットの割り当て方法は、FD文に記述されたデータセットの特性によって異なります。
-
NORMALデータセット
最も一般的な方法であり、FILEパラメータに割り当てるデータセット名が与えられている場合です。OpenFrameのデータセット割り当てモジュールを呼び出してデータセットを割り当てます。また、アプリケーションがこのデータセットを使用できるように、割り当ての結果をアプリケーションの環境に渡します。
-
SYSOUTデータセット
FD文にSOUTパラメータが指定されたデータセットです。SYSOUTデータセットは、ジョブ・スプールにジョブの実行結果として作成される出力データを保存するために作成されます。
-
一時データセット
FD文のFILEパラメータが指定されていないSYSOUTデータセット以外のデータセットは一時データセットです。この場合、tjclrunは一時データセットに一意の名前を付与します。一時データセットは、ジョブの実行フェーズで作成され、ジョブの終了時に削除されます。
tjclrunは、ユーザーが指定した一時データセット以外にも、内部的にくつかの一時データセットを使用します。以下の入力ストリーム・データセットの処理もその一例です。
-
入力ストリーム・データセット
EXPJCL(ジョブ・ストリーム)に「FD access name=*」形式で記述されたデータセットです。
tjclrunは、入力ストリーム・データセットをジョブ・スプールに別途保存した後、内部的にデータセット名を付与します。その後は一般的なデータセットと同様に、OpenFrameのデータセット処理モジュールを使用して割り当てし、バッチ・プログラムでこのデータセットを使用できるようにします。tjclrunは、ジョブ・スプールに一時保存された入力ストリーム・データセットがジョブの終了時に削除されるように一時データセットとして作成します。
-
2.6. スペシャルFD
FD文は、以下の形式でJCLにコーディングされます。
¥[label] FD access name=[parameters,...]
システムで特殊な用途で使用するために予約されているアクセス名を持つFD文をスペシャルFD文と呼びます。
ユーザーが特殊な用途で使用するために予約されたスペシャルFDのアクセス名は、指定された以外の用途では使用できません。 |
TJESは、以下のスペシャルFDをサポートします。
-
PRGLIB
PRGLIB FDは、tjclrunがEX文に指定されたバッチ・アプリケーションを検索するPDS(ライブラリ・パス)を指定します。PRGLIB FDは、ジョブ・ステップのEX文の次に位置し、ジョブ・ステップで呼び出すプログラムを検索するPDS(ライブラリ)を指定します。FD文の連結(CF)機能を使用して、複数のPDSからプログラムを検索するように指定できます。
PRGLIB FDの連結機能については、富士通の『XSP JCL文法書』を参照してください。
PRGLIB FDが指定されていない場合は、OpenFrame環境設定のtjclrunサブジェクトのSYSLIBセクションに指定されたパスから実行するバッチ・プログラムを検索します。
-
STEPCAT
STEPCAT FDは、ジョブ・ステップで使用するデータセット・カタログを指定します。FD文の連結(CF)機能を使用して複数のデータセット・カタログを指定できます。
STEPCAT FDは、ジョブ・ステップのEX文の次に位置し、そのジョブ・ステップで使用するデータセット・カタログを指定します。STEPCATが指定されていない場合は、OpenFrameシステムのマスター・カタログが使用されます。STEPCATが指定された場合でも、指定されたカタログにデータセットがカタロギングされていない場合は、マスター・カタログでデータセットについてのカタログ情報を検索します。
2.7. 出力処理
JCL FD文には、ジョブ・スプールに作成されるSYSOUTデータセットの出力処理方法を表示するか制御するための、SOUT、OG、FORM、CHARSなどのパラメータが含まれています。SYSOUTデータセットを示すFD文は1つ以上のパラメータ値を参照し、その出力を処理するための方法を指定できます。
2.8. ジョブ・スプール
tjclrunは、ジョブを実行する各フェーズで多様な目的でジョブ・スプールを使用します。
tjclrunがジョブ・スプールに作成するデータセットと用途は以下のとおりです。
-
INPJCL
最初にサブミットする際のJCLファイルです。ジョブ・スプールのほとんどのファイルは、tjclrunによって作成されますが、INPJCLは、TJESのSUBMITOR(obmjmsvr)がジョブのサブミットを処理するときにジョブ・スプールに事前に作成します。その内容は、ユーザーがサブミットしたJCLファイルの内容と同じです。
-
EXPJCL
tjclrunが実行するジョブ・ストリームが含まれているJCLファイルです。EXPJCLは、tjclrunが使用するために、TJESのSUBMITOR(obmjmsvr)がジョブのサブミットを処理する際にジョブ・スプールに作成したファイルであり、INPJCLでXSPマクロ処理を行った後のファイルです。
-
INSDSET
INPJCLに以下の形式で記述されている入力ストリーム・データセットを、tjclrunが内部的に使用するためにジョブ・スプールに作成する一時データセットです。
以下は、入力ストリーム・データセットを設定する例です。
¥label FD AccessName=* line1 line2 ... lineN
上記の例の場合、INSDSETはline1、line2、…、lineNをデータ内容とする一時データセットです。FDを使用するジョブ・ステップで作成され、そのジョブ・ステップの終了時に削除されます。このような動作をINSDSET SHUNTと呼びます。
tjclrunがINSDSET SHUNTを行う理由は、入力ストリーム・データセットは一般の非VSAMデータセットと一緒に連結されることがあるためです。入力ストリーム・データセットをINPJCLから抽出してデータセットにシャント(SHUNT)すると、非VSAM SDSの連結ロジックを使用して一貫した方式で連結処理をサポートします。
-
JESJCL
tjclrunがEXPJCLを解析した結果の解析ツリーをテキスト形式で出力した内容が含まれるファイルです。問題を分析する際に参考データとして使用されます。
-
JESMSG
tjclrunの終了時に、tjclrunを実行したランナー・スロットが対応するジョブ・スプールに記録するデータセットです。実行されたジョブに関する基本的な情報やジョブの実行でレポートされた統計情報およびジョブ・ステップに関する情報などが含まれています。
-
SYSMSG
SYSMSGは、tjclrunのメッセージ・ログです。ジョブの実行時に必要なサブステップの進行状況や重要な結果メッセージだけではなく、ジョブの処理時に発生したエラー・メッセージなどが含まれます。ジョブが異常終了した場合は、原因を分析するためにSYSMSGの内容を確認する必要があります。
SYSMSGの内容は、tjclrunがジョブ・ステップを実行した順に従って詳細や動作が発生した時間順に記録されます。
SYSMSGに出力される内容は以下のとおりです。
-
実行中のジョブ・ステップ名
-
ジョブの実行中に割り当てられたデータセットの情報
-
tjclrunが呼び出したPGM名とプロセスID(pid)
-
tjclrunが呼び出したPGMの終了状態
-
tjclrunが現在実行中の動作
-
tjclrunの主要動作の成功の可否
-
-
SYSOUT
SYSOUTデータセットは、FD文にSOUTパラメータが指定されている場合を指します。SYSOUTデータセットは、他のデータセットと違ってジョブ・スプールに保存され、一般的に出力データを保存します。
以下は、SYSOUTデータセットを設定した例です。
¥ EX MONTHLY ¥ FD SYSIN=* 2007-07-01,2007-08-01 ¥ FD SYSOUT=DA,SOUT=A ¥ FD RPTOUT=DA,SOUT=B ¥ FD RPTERR=DA,SOUT=C
上記のジョブ・スプールのデータセットは、TJESがジョブを効率的に実行するために使用しますが、SYSOUTデータセットは、ユーザーがバッチ・プログラムのために要求したデータセットとして、ジョブ・スプールに保存されるように特別に指定したデータセットです。SYSOUTデータセットは、1つのジョブやジョブ・ステップで複数指定できます。上記例では、SYSOUT、RPTOUT、RPTERRがSYSOUTデータセットです。
SYSOUTデータセットの内容は、ユーザーが指定したバッチ・プログラムで出力する内容です。TJESは、SYSOUTデータセットに他の情報を追加および削除しません。バッチ・プログラムでSYSOUTデータセットの使用が終了すると、TJESは、SYSOUTデータセットの出力クラスに応じてユーザーが出力した内容をプリンターや画面に出力するプロセスを管理します。
2.9. ジョブ制御
TJESでは、スケジューリングの後、実行中のジョブをSUSPEND(一時停止)、RESUME(再開)、STOP(強制終了)することができます。
TJESでは、ジョブを実行するための複数のサブプロセスに対する制御をジョブ制御といいます。tjesmgrまたはOpenFrame Managerの[Batch]メニューなどのユーザー・インターフェースを使用して実行中のジョブを制御することができます。
ジョブ制御コマンドの使用方法については、 TJESMGRコマンドおよびOpenFrame Manager『ユーザーガイド』を参照してください。 |
実行中のジョブに対してジョブ制御コマンドを入力すると、以下の手順で処理されます。
-
TJESがtjclrunにジョブを制御するためのシグナル(SIGUSR1)を送信します。
-
tjclrunは、受信したSIGUSR1に含まれている情報を参照して、要求された動作(SUSPEND/RESUME/STOP)を把握します。
-
UNIXシステムのジョブ制御シグナル(SIGSTOP/SIGCONT/SIGKILL)を、tjclrunがジョブ・ステップで実行したサブプロセスに送信します。
-
サブプロセスは、受信したシグナルに応じて一時停止、再開、または強制終了されます。
-
tjclrunは、サブプログラムに対してジョブ制御を実行した後、その結果をTJESにレポートします。
-
tjclrunは、要求された動作がSUSPENDの場合は、自分自身にSIGSTOPを送信して実行を一時停止し、STOPの場合は実行を終了(exit)します。また、RESUMEの場合は、TJESからtjclrunにSIGCONTを送信して、tjclrunの実行を再開します。実行が再開されたtjclrunは、自身が実行したサブプロセスにSIGCONTを送信します。
tjclrunのジョブ制御は、UNIXシステムのジョブ制御シグナル(SIGSTOP/SIGCONT/SIGKILL)を使用して実装されているため、プロセスの実効ユーザーIDが異なると、サブプロセスにシグナルを送信する際、権限問題によってエラーが発生することがあります。したがって、ジョブ制御を正常に実行するには、tjclrunにルート権限を付与する必要があります。詳細については、セキュリティのsetuid root tjclrunを参照してください。 |
2.10. ジョブ・レベルのレポート
tjclrunは、ジョブの実行情報をTJESにレポートします。レポートの内容は、ジョブの全般的な情報と特定のジョブ・ステップ情報に分けられます。
以下は、tjclrunがTJESにレポートする情報です。
-
ジョブの開始と終了
tjclrunがジョブの実行を開始および終了したことをTJESにレポートします。ジョブ終了のレポートには、ジョブの実行が正常に終了したかどうかを示す終了状態と終了コードが含まれます。
-
ジョブ制御の状態
TJESは、tjclrunが実行しているジョブをSUSPEND/RESUME/STOPさせることができます。tjclrunは、要求されたジョブ制御を実行した後、ジョブの状態をTJESにレポートします。
-
データセットのロック待機
tjclrunは、ジョブを実行する前にそのジョブで使用されるデータセットのロックを要求します。
tjclrunは、ロックを要求したデータセットが他のジョブによってすでにロックされ、使用されている場合、ジョブを処理せずにロックが成功するまで待機します。そのとき、問題の原因となるジョブとロック要求を待っているデータセットをTJESにレポートします。管理者は、レポート情報を検討して、複数のジョブ間でデータセットが共有され、ジョブの処理が遅延される問題を解決することができます。
2.11. ステップ・レベルのレポート
以下は、tjclrunのジョブ・ステップ・レベルのレポート情報です。
-
ステップの開始と終了
tjclrunは、ジョブを構成する各ジョブ・ステップ処理の開始と終了をTJESにレポートしています。
STEP STARTは、現在実行中のジョブ・ステップのパス(ジョブ・ストリームでのロケーション)情報と、ジョブ・ステップのタイプ(PGMまたはPROC)などをレポートします。また、STEP FINISHは、ジョブ・ステップの終了状態、終了コード、実行時間などをレポートします。
-
データセットの割り当て
tjclrunは、ジョブ・ステップに指定されたバッチ・プログラムを呼び出す前に、バッチ・プログラムが使用するデータセットを事前に割り当てます(割り当てられるデータセットはJCLのDD文によって指定されます)。
データセットの割り当て情報は、OpenFrameシステムにおいて非常に重要な情報であるため、tjclrunによって割り当てられたddnameとデータセット名は、ジョブ・スプールのSYSMSGとOpenFrame_HOME/log/sysディレクトリのdsalcログに記録されます。
-
データセット入出力のレポート
バッチ・プログラムによって使用および変更されたデータセットの入出力情報が反映します。
tjclrunは、バッチ・プログラムの実行中に行われたデータセットの入出力統計情報をTJESに定期的にレポートします。管理者(ユーザー)は、特定のデータセットに対してジョブ・ステップごとに実行された読み書きを監視することができます。
2.12. セキュリティ
2.12.1. TACFの代理ユーザー
一般的にジョブを特定のユーザー権限で実行するには、JCLのUSER文にユーザーIDとパスワードを指定します。この際、JCL USER文のパスワードを暗証化していない状態で指定するため、JCLファイルのセキュリティが厳しく管理されていない環境ではユーザーのパスワードが漏れてしまう恐れがあります。
このようなリスクを防ぐために、TJESでは代理ユーザー(Surrogate User)として指定されたユーザーが実行ユーザー(Execution User)に代わって、パスワードを指定せずに実行ユーザーの権限でジョブをサブミットすることができます。代理ユーザーが実行ユーザーに代わってジョブをサブミットする場合も、ジョブは実行ユーザー権限で実行されます。代理ユーザーの役割は、実行ユーザーの代わりにジョブをサブミットするだけです。代理ユーザーによるジョブのサブミットは、JCLのUSER文にパスワードが指定されていない場合にのみ動作します。
TACFでジョブを実行するために代理ユーザーを指定する方法は、OpenFrame TACF『管理者ガイド』を参照してください。 |
2.12.2. setuid root tjclrun
UNIXシステムでプログラムの実行ユーザーではなく、プログラム・ファイルの所有者権限で実行するために、実行プログラムの所有者とファイルのパーミッションを適切に変更して設定することをsetuidといいます。ただし、setuidされたプログラムを実行する場合も、実行するユーザーにそのプログラムの実行権限が必要です。つまり、setuid rootとは、特定のプログラムの実行時、プログラムを実行したユーザーではなく、ルート・ユーザー権限でプロセスが実行されるように設定することを意味します。
本節でのプロセスのユーザーは、UNIXプロセスの有効なユーザー(effective userid)を示します。tjclrunはプロセスの実行中には、tjclrunの環境設定と関係なく、プロセスの実際のユーザー情報(real userid)を変更しません。UNIXシステムでファイルおよびシステム・リソースの権限チェックは、プロセスの有効なユーザーに対して行われます。
ユーザー情報は、プロセスを直接呼び出したユーザーを識別するために使用されます。このユーザーは、OS上のユーザーであり、TACFのユーザーとは直接関係ありません。
以下の2つの事項を考慮して、OpenFrame TJESのインストール後にtjclrunプログラムにルート実行権限を付与するかどうかを決めます。
-
ジョブ制御を実行する場合、tjclrunが実行したバッチ・プログラムがtjclrunを実行するプロセスの有効なユーザーと異なるユーザーで実行される場合、tjclrunはUNIXのジョブ制御シグナルに基づいたジョブ制御を権限不足で正常に実行できなくなります。このような場合でも、ジョブ制御を正常に実行するために、tjclrunプログラムにルート実行権限を付与することを考慮する必要があります。
また、上記のような状況は特別な状況であり、管理者が直接ルート・ユーザーとしてログインし、そのプロセスに対してジョブ制御シグナルを送信することもできますが、このような手動作業は管理者の負担を増やす要因となります。たとえば、tjclrunが実行するバッチ・プログラムに対し、tjclrunプロセスの有効なユーザーではなく、別のユーザーでsetuidされている場合、このような問題が発生します。
-
ジョブを実行するtjclrunおよびジョブ・ステップで実行されるバッチ・プログラムを実行するプロセスをジョブに指定されたユーザー権限で実行するには、OpenFrame環境設定のtjclrunサブジェクトのACCOUNTセクションのSETUIDをYESに設定し、またtjclrunプログラムの実行時にルート実行権限を付与する必要があります。
UNIXシステムでプロセスを実行するユーザー情報をプログラムの実行中に変更するには、特定のユーザー(root)権限が必要です。このような制約を避けるために、TJESシステムをルート権限で運用する方法もありますが、システムのセキュリティおよび管理上の理由でお勧めしてしていません。その代わり、tjclrunプログラムに対してsetuid rootを行うと、tjclrunプログラムの実行ユーザーがルート・ユーザーでなくても、tjclrunの実行時にtjclrunプログラム・ファイルの所有者(root)の権限でtjclrunが実行されます。
以下は、setuid rootの手順を示します。
$ cd $OPENFRAME_HOME/bin
$ su
$ chown 0:0 tjclrun
$ chmod s+u tjclrun
$ ls -l tjclrun
-rwsr-xr--x root system {size} {date-time} tjclrun
$ exit
ファイル・パーミッションが-rwsr-xr- -xであり、所有者がrootに変更されていることを確認します。詳細については、UNIXガイドの「man chmod」と「man chown」を参照してください。
プログラムが実行された直後、tjclrunはルート権限を持っているため、JCLに指定されたユーザー権限でプロセス・ユーザーを変更することができます。tjclrunは、実行初期の非常に制限された作業のみをルート権限で行い、ジョブを実行するほとんどの作業は、JCLに指定されたユーザー権限で行います。
ジョブのプロセス・アカウンティングとSTOPなどのジョブ制御を使用しない場合は、tjclrunプログラムに対するsetuidとtjclrun環境設定のsetuidは不要です。
IBM AIXの場合、setuid rootされたプログラムを実行すると、セキュリティ上の理由で共有ライブラリを検索する環境変数のLIBPATHが削除されるため、tjclrunの実行時にtjclrunが使用するOpenFrame製品の共有ライブラリをロードできない問題が発生します。この問題は、tjclrunプログラムをインストールした後、再リンクすることで解決できます。これにより、環境変数のLIBPATHではなく、リンクするときのディレクトリから必要な共有ライブラリを検索できます。 つまり、外部ユーザーが悪意を持って変更した共有ライブラリがルート権限を持つプロセスで使用されることを防ぐための、IBM AIXシステムのセキュリティ・ポリシーです。 |
以下の例は、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コマンドで出力されるtjclrunが使用するライブラリのうち、OpenFrame製品に含まれているライブラリです。
|
2.13. tjclrunの呼び出し
tjclrunは、以下のような実行引数と一緒に実行されます。
TJESのランナー・スロットは、ジョブの実行が割り当てられた時点のTJESの状態に基づいて、適切な実行引数と一緒に実行されます。
tjclrun RUNMODE JOBID INITINDEX JCLPATH JOBPOS RESTART
引数 | 説明 |
---|---|
RUNMODE |
ジョブ(normal run)またはSCAN(syntax test)テストです。 |
JOBID |
一意のジョブIDです。(例:JOBnnnnn) |
INITINDEX |
ランナー・スロットの索引です。 |
JCLPATH |
実行するJCLのパスです。 |
JOBPOS |
ジョブ・ストリームに複数のジョブが存在することを考慮した実行するジョブの位置です。 |
RESTART |
再開するジョブ・ステップを指定します。
|
tjclrunをシェルのコマンドラインで直接実行することは、TJESのジョブ管理のサブミットやスケジューリングをスキップして直接実行することになるため、正常なジョブ実行は保証されません。 |
2.14. XSPでサポートするJCLステートメント
以下の表は、XSPでサポートするJCLステートメントを示しています。
-
XSP JCLステートメント
ステートメント パラメータ サポート 備考 JOBG
Job grpup name
O
WAIT
O
REL
O
MULTI
O
PRTY
O
ACCT
X
DVAL
O
LB
X
PGID
X
RSIZE
X
ASR
X
CODE
Job code
X
ジョブの識別は、JOBIDが使用されます。
JOB
Job name
O
LIST
X
ACCT
X
PSW
X
PRTY
O
TIME
X
ML
O
RSIZE
X
PARA
O
LANG
X
OG
X
HOLD
O
OHOLD
X
RSTEP
O
MULTI
X
MKEY
X
FORM
X
FORMS
X
BURST
X
BOXNO
X
EX
Program name
O
VSPEC
X
RSIZE
X
PRTY
X
TIME
X
COND
O
OPT
X
PARA
O
LANG
X
NOMNT
X
PARAGRP
X
PARA
Parameters
O
FD
Access name
O
FILE
O
VOL
O
DISP
O
MEMBER
O
領域割り当て
O
RSV
X
DRTY
X
PSW
X
PROTECT
X
RETPD
X
PRTYPE
X
SOUT
O
OG
O
LIMIT
X
FORM
O
FORMS
O
CHARS
O
COPIES
O
FLASH
O
BURST
X
MODIFY
X
DATA
X
SW
O
FCB
O
AMP
X
DIAG
X
PSIZE
X
ISF
X
SW
Access name
O
STEP
O
FILE
O
VOL
O
DISP
O
MEMBER
O
PROTECT
X
PRTYPE
X
FCB
O
AMP
X
PAUSE
message
O
MSG
message
O
NOTE
message
X
JEND
O
JGEND
O
FIN
O
SYSIN
UNIT
X
FILE
O
VOL
X
MEMBER
X
DISP
X
マクロ呼び出し文
params
O
CHAM
FILE
O
VOL
O
PSW
X
MACRO
params
X
MEND
X
FDR
X
FDDS
FD名
O
DATA
X
DISP
O
VOL
X
FDDE
O
STACK
FILE
O
VOL
O
MEMBER
O
RJ
X
RJS
O
JG
X
OG
X
命令文
FSOUT
X
JALT
O
STACK
O
CAT
FILE
X
VOL
X
DISP
X
UNCAT
FILE
X
DISP
X
DATA
UNIT
O
FILE
O
VOL
O
DISP
X
MEMBER
O
領域割り当て params
X
DRTY
X
PSW
X
PROTECT
X
RETPD
O
DATA
X
JOBG
O
END
O
SCAN
*
X
SCAN機能のみサポートします。
JN
X
LIST
X
FILE
X
VOL
X
DISP
X
MEMBER
X
領域割り当て params
X
DRTY
X
PSW
X
PROTECT
X
RETPD
X
DATA
X
SCEND
O
USER
ユーザー識別名
O
UPSW
O
GROUP
O
UEND
O
NOP
O
コメント文
O
入力データ段落文
O
EOFカード
O
-
XSP JCM(マクロ)ステートメント
ステートメント パラメータ サポート 備考 DEFINE
O
定義本体文
O
SKIP
O
IF
O
IFN
O
SET
O
MSG
X
WTO
X
WTOR
X
NOP
O
DEXIT
O
DEFEND
O