3.2.3 ジョブ定義スクリプトを子孫ジョブとして実行する
ジョブ定義スクリプトを子孫ジョブとして実行する方法,および子孫ジョブの動作について説明します。優先順序については,「5.1.11(3) コマンドの実行方法の優先順序」および「5.1.11(4) 関数と同名の子孫ジョブまたは外部コマンドの優先順序」を参照してください。
- 〈この項の構成〉
(1) 子孫ジョブの実行方法
(a) 環境ファイルにパラメーターを指定して子孫ジョブを実行する方法
ルートジョブの子孫プロセスとして実行されるジョブ定義スクリプトのうち,次のどれかのパラメーターの指定,またはパラメーターのデフォルト定義によって実行されたジョブを子孫ジョブと呼びます。
-
CHILDJOB_EXTパラメーター
-
CHILDJOB_PGMパラメーター
-
CHILDJOB_SHEBANGパラメーター
CHILDJOB_SHEBANGパラメーターの指定によって子孫ジョブを起動する動作の例を次の図に示します。
この例では,ルートジョブのジョブ定義スクリプトに,ほかのジョブ定義スクリプトchildjob.ashを指定しています。このとき,childjob.ashは,CHILDJOB_SHEBANGパラメーターの定義に合致するため,JP1/Advanced Shellは子プロセスとしてJP1/Advanced Shellのジョブを起動し,childjob.ashを子孫ジョブとして実行します。
なお,子孫ジョブを起動するルートジョブが論理ホストで実行された場合は,子孫ジョブも論理ホストで実行されます。
(b) パラメーターのデフォルト定義で子孫ジョブを実行する方法
CHILDJOB_SHEBANGパラメーターのデフォルト定義を使用することで,環境ファイルにパラメーターを指定することなく,子孫ジョブを起動できます。
CHILDJOB_SHEBANGパラメーターには,次の2つがデフォルトで定義されています。
デフォルト定義 |
子孫ジョブ起動時の出力モード |
---|---|
/opt/jp1as/bin/adshexec |
OUTPUT_MODE_CHILDパラメーターの指定に従って動作します。 |
/opt/jp1as/bin/adshexec -mMINIMUM |
最小出力モードで動作します。 |
これによって,1行目に「#! /opt/jp1as/bin/adshexec」を記述したジョブ定義スクリプトをほかのジョブ定義スクリプト中に指定することで,子孫ジョブとして実行できます。また,特定の子孫ジョブだけを最小出力モードで実行したい場合は,ジョブ定義スクリプトの1行目に「#! /opt/jp1as/bin/adshexec -mMINIMUM」を記述してください。
デフォルト定義で実行された子孫ジョブの動作は,「(a) 環境ファイルにパラメーターを指定して子孫ジョブを実行する方法」で起動された子孫ジョブと同じです。
ただし,CHILDJOB_SHEBANGパラメーターのデフォルト定義よりも,環境ファイルに指定したCHILDJOB_SHEBANGパラメーターが優先されます。そのため,デフォルト定義と同じ内容を環境ファイルのCHILDJOB_SHEBANGパラメーターに指定した場合,次のように動作します。
-
環境ファイルの内容
#-adsh_conf CHILDJOB_SHEBANG "/opt/jp1as/bin/adshexec -mMINIMUM"
-
子孫ジョブで起動するジョブ定義スクリプト
#! /opt/jp1as/bin/adshexec -mMINIMUM :
この場合,ジョブ定義スクリプトに指定した「/opt/jp1as/bin/adshexec -mMINIMUM」は,環境ファイルのCHILDJOB_SHEBANGパラメーターの定義に合致します。そのため,子孫ジョブの出力モードはOUTPUT_MODE_CHILDパラメーターの指定に従います。
(2) ルートジョブや外部スクリプトとの機能比較
ルートジョブ,子孫ジョブおよび外部スクリプトの機能比較を次に示します。
機能 |
ジョブ |
外部スクリプト |
||
---|---|---|---|---|
ルートジョブ |
子孫ジョブ |
.(ドット)コマンドの外部スクリプト |
#-adsh_scriptの外部スクリプト |
|
呼び出し元ジョブとのプロセスの関係 |
呼び出し元ジョブの子プロセスで動作する |
呼び出し元ジョブの子プロセスで動作する |
呼び出し元ジョブと同一プロセスで動作する |
呼び出し元ジョブと同一プロセスで動作する |
起動するジョブコントローラ |
|
|
なし |
なし |
スプールジョブディレクトリ |
作成する |
ルートジョブのスプールジョブディレクトリ内に作成し,ジョブ終了時に削除する。 ジョブ実行ログの出力内容は次のどちらかをユーザーが選択する。
|
作成しない (コマンド実行結果を呼び出し元ジョブのJOBLOGに出力する。また,スクリプトイメージは出力しない) |
作成しない (コマンド実行結果を呼び出し元ジョブのJOBLOGに出力する。また,スクリプトイメージを呼び出し元ジョブのSCRIPTに出力する) |
ジョブ開始・終了メッセージ |
あり (KNAX0091-IおよびKNAX0098-I) |
あり (KNAX6571-IおよびKNAX6578-I) |
なし |
なし |
環境ファイルの読み込み |
する |
する |
しない (呼び出し元ジョブの動作に従う) |
しない (呼び出し元ジョブの動作に従う) |
標準入力の使用可否 |
使用可 |
使用可 |
使用可 |
使用可 |
標準出力の出力先 |
-sオプション,-mオプション,OUTPUT_STDOUTパラメーターおよびOUTPUT_MODE_ROOTパラメーターの指定に従う |
親プロセスから継承した出力先になる |
呼び出し元ジョブの動作に従う |
呼び出し元ジョブの動作に従う |
(3) シグナル受信時の子孫ジョブの動作
ここでは,シグナル受信時の子孫ジョブの動作を説明します。
次に示すジョブを例に,ルートジョブ,子孫ジョブ,および外部コマンドへ終了要求シグナルを送信した場合の動作を示します。
adshexec(1)−adshexec(2)−adshexec(3)−sleep
JP1/AJSから強制終了(JP1/AJSからadshexec(1)へSIGTERM送信)した際,およびログインシェルからadshexec(1)〜(3)およびsleepへSIGTERM送信した際の動作を次に示します。
時期 |
adshexec(1) |
adshexec(2) |
adshexec(3) |
sleep |
---|---|---|---|---|
JP1/AJSからの強制終了時 |
rc=143でエラー終了 |
rc=143でシグナルによるエラー終了 |
rc=143でシグナルによるエラー終了 |
rc=143でシグナルによるエラー終了 |
ログインシェルからadshexec(1)へのSIGTERM送信時 |
rc=143でシグナルによるエラー終了 |
rc=143でシグナルによるエラー終了 |
rc=143でシグナルによるエラー終了 |
rc=143でシグナルによるエラー終了 |
ログインシェルからadshexec(2)へのSIGTERM送信時 |
|
rc=143でシグナルによるエラー終了 |
rc=143でシグナルによるエラー終了 |
rc=143でシグナルによるエラー終了 |
ログインシェルからadshexec(3)へのSIGTERM送信時 |
adshexec(2)の結果に従う |
|
rc=143でシグナルによるエラー終了 |
rc=143でシグナルによるエラー終了 |
ログインシェルからsleepへのSIGTERM送信時 |
adshexec(2)の結果に従う |
adshexec(3)の結果に従う |
|
rc=143でシグナルによるエラー終了 |
(4) 子孫ジョブからさらに実行する子孫ジョブがある場合の注意事項
子孫ジョブからさらに実行する子孫ジョブがある場合,中間のジョブがUNIXのSIGKILLやWindowsのTerminateProcessで即時終了すると,ルートジョブがすべての子孫ジョブの完了を待たないで終了することがあります。そのため,このような即時終了操作は実行しないでください。
もし,この現象が発生した場合は,関連するルートジョブや子孫ジョブの実行結果を調査してください。なお,即時終了したジョブ以外のすべての子孫ジョブは,スプールジョブディレクトリが削除に失敗して残っているか,削除されていてもJOBLOGの内容が標準エラー出力へ出力されているため,ログは失われません。
- (例)
-
次のように,子孫ジョブからさらに子孫ジョブを実行するケースについて説明します。「→」は,ジョブが呼び出しによって実行されることを示します。
[ルートジョブ]→[子孫ジョブ(子)]→[子孫ジョブ(孫)]
このとき[子孫ジョブ(子)]が即時終了すると,[子孫ジョブ(孫)]より[ルートジョブ]が先に終了する場合があります。この場合の各ジョブの動作と,スプールジョブディレクトリの状態を次に示します。
項目
ジョブの種類
ルートジョブ
子孫ジョブ(子)
子孫ジョブ(孫)
ジョブの動作
子孫ジョブ(子)がエラー終了したものとして動作します。
ユーザープログラムがエラーで即時終了した場合と同じ動作となります。
即時終了します。
ジョブは通常どおり終了します。
ただし,Windowsでは,ほかの関連するジョブの状態によっては強制終了として動作することがあります。
スプールジョブディレクトリの状態
Windowsで子孫ジョブ(孫)がジョブ実行ログをまだオープンしている場合,スプールジョブディレクトリのリネームに失敗します。
上記以外の場合およびUNIXの場合,スプールジョブディレクトリは通常どおりリネームされます。
削除されないで残ります。
ルートジョブがスプールジョブディレクトリのリネームに成功している場合,スプールジョブディレクトリはリネームに失敗します。
上記以外の場合,通常どおりJOBLOGの内容をstderrに出力して削除されます。