3.1.2 ジョブ
JP1/AJS,Windowsのコマンドプロンプト,またはUNIXのシェルなどからジョブコントローラを起動する要求は,ジョブとして受け付けられます。ジョブを利用する一般ユーザーは,指示をまとめて記述したジョブ定義スクリプトをジョブコントローラに渡します。
ジョブを利用する一般ユーザーが指定した指示は,ジョブコントローラによって何が要求されているかが分析され,システム資源が効率良く利用されるようにジョブを実行します。
- 〈この項の構成〉
(1) ルートジョブと子孫ジョブ
ジョブとは一般に,一般ユーザーが用意する1つのまとまった仕事をシステムに要求する単位です。要求する仕事は互いに独立したものと考えられます。
ジョブは一連の処理プログラムから構成されています。これらの処理プログラムを実行するには,その実行の順序,実行の条件,および処理プログラムの実行に必要なファイルを定義する必要があります。
ジョブには,ルートジョブと子孫ジョブがあります。
-
JP1/AJSやログインシェルなどから実行するジョブのうち,子孫ジョブ以外のジョブのことです。
-
ルートジョブの子孫プロセスとして実行されるジョブ定義スクリプトのうち,次のどれかのパラメーターの指定,またはパラメーターのデフォルト定義によって実行されるジョブのことです。
-
CHILDJOB_EXTパラメーター
-
CHILDJOB_PGMパラメーター
-
CHILDJOB_SHEBANGパラメーター
-
ルートジョブと子孫ジョブの起動の流れの例を次の図に示します。
(2) ジョブの入力モード
ジョブは,標準入力の状態によって次に示すどちらかのモードで実行します。
-
端末入力モード
ジョブ起動時に標準入力が端末に関連づけられている場合,このモードで動作します。このモードで起動する方法の例を次に示します。
-
ログインシェルで,標準入力を端末に関連づけた状態でadshexecコマンドを実行する。
-
-
非端末入力モード
ジョブ起動時に標準入力が端末に関連づけられていない場合,このモードで動作します。
このモードで起動する方法の例を次に示します。
-
JP1/AJSからジョブを起動する。
-
ログインシェル上で,標準入力をファイルからリダイレクトしてadshexecコマンドを実行する。
-
ログインシェル上で,パイプの途中または末尾でadshexecコマンドを実行する。
-
ジョブ起動時に,ジョブをどちらのモードで実行するかを示すKNAX7902-Iメッセージを出力します。
UNIXの場合,ジョブの入力モードによってジョブの強制終了時の動作に差異があります。詳細は,「3.11 ジョブを強制終了する」を参照してください。
Windowsの場合,ジョブの入力モードによるジョブの動作の差異はありません。
(3) ジョブとジョブの関係
ルートジョブ同士は互いに独立しています。したがって,同時に処理するルートジョブ同士,または先に実行したルートジョブがあとに実行するルートジョブに影響を及ぼすことはありません。さらに,ファイル上の情報を除けば,ルートジョブからルートジョブに情報を引き継がれることもありません。
ただし,次の場合にジョブ同士が関連を持つことがあります。
-
JP1/AJSによるスケジュールによっては,ルートジョブ相互に実行順序関係ができます。
-
複数のジョブで同時に同一の通常ファイルを使用する場合は,それらのジョブ同士が関連を持ちます。ジョブが適切な順序で実行されるようJP1/AJSのスケジュールを設計する必要があります。
-
ルートジョブと子孫ジョブ,および子孫ジョブと子孫ジョブは,互いに関連を持つ場合があります。
(4) ジョブと環境ファイルの関係
ルートジョブと子孫ジョブは,どちらもジョブ起動時にシステム環境ファイルおよびジョブ環境ファイルを読み込みます。したがって,次のようなケースではルートジョブと子孫ジョブは異なる環境ファイルのパラメーターで動作します。
-
ルートジョブが起動時に環境ファイルを読み込んでから,子孫ジョブが起動時に環境ファイルを読み込むまでの間に,環境変数ADSH_ENVの値が別のジョブ環境ファイルパスに書き変えられた場合。
-
ルートジョブが起動時に環境ファイルを読み込んでから,子孫ジョブが起動時に環境ファイルを読み込むまでの間に,システム環境ファイルおよびジョブ環境ファイルの内容が書き変えられた場合。
ルートジョブと子孫ジョブを同じ環境ファイルのパラメーターで動作させたい場合は,環境変数ADSH_ENVの値,および環境ファイルの内容をジョブ実行中に変更しないでください。
また,環境ファイルにexportパラメーターを定義している場合,ジョブが親プロセスから引き継いだ環境変数の値よりも,環境ファイルのexportパラメーターで設定した値が優先されます。例を次に示します。
-
ルートジョブroot.ash
export ENV1=SCRIPTFILE childjob.ash #子孫ジョブを起動
-
子孫ジョブ childjob.ash
echo $ENV1
-
ルートジョブroot.ashと子孫ジョブchildjob.ashが読み込む環境ファイルadshrc.aseの内容
export ENV1=ENVFILE
-
子孫ジョブchildjob.ashのechoの出力結果
export ENV1=ENVFILE
この例では次の順に動作します。
-
ルートジョブroot.ashが起動し,環境ファイルadshrc.aseのexportパラメーターによって,ENV1にはENVFILEが設定されます。
-
ルートジョブroot.ashは,子孫ジョブchildjob.ashを起動する前に,環境変数ENV1にSCRIPTFILEを設定します。
-
子孫ジョブchildjob.ashが起動すると,ルートジョブroot.ashから環境変数ENV1を引き継ぎます。子孫ジョブchildjob.ashのプロセス起動直後のENV1の値はSCRIPTFILEです。
-
子孫ジョブchildjob.ashは起動時に環境ファイルadshrc.aseを読み込みます。exportパラメーターによってENV1にはENVFILEが設定されます。
-
子孫ジョブchildjob.ashのechoの結果は,4.で設定されたENVFILEになります。
(5) 一時ファイルと通常ファイル
バッチジョブでは,オープン基盤製品からの情報などを一時ファイルまたは通常ファイルとして参照し,処理を実行します。
(6) 非同期実行プロセスの動作
JP1/Advanced Shellでは,関連するすべてのルートジョブ,子孫ジョブ,およびコマンドが終了するまでは,ジョブは終了しません。
(a) &や|&による非同期実行【UNIX限定】
&や|&を指定して実行したプロセスがすべて完了するまで,ジョブは終了しません。
ただし,非同期実行したプロセスがSIGSTOPなどを受信し,ジョブの終了と同時に停止状態になった場合,そのプロセスの終了を待たないでジョブを終了することがあります。非同期実行したプロセスを待たないでジョブを終了したい場合は,非同期実行したい部分だけOSのシェルを使用するように,ジョブ定義スクリプトを作成してください。
例を次に示します。
- 非同期実行したプロセスの終了を待つジョブ定義スクリプトの例
#!/opt/jp1as/bin/adshexec mycommand A &
このジョブ定義スクリプトをJP1/Advanced Shellで実行すると,mycommandの完了を待ってからジョブが終了します。mycommandの完了を待たないでジョブを終了したい場合は,次のようにジョブ定義スクリプトを作成してください。なお,この例では,OSのシェルとして/bin/kshを使用しています。
- 非同期実行したプロセスの終了を待たないで終了するジョブ定義スクリプトの例
#!/opt/jp1as/bin/adshexec /bin/ksh exec_cmdA.sh
- exec_cmdA.shの内容
mycommand A &
(b) execコマンドによる外部コマンドの実行
execコマンドの引数に外部コマンドを指定した場合,adshexecコマンドは外部コマンドを子プロセスとして実行し,完了を待ちます。外部コマンドが完了したら,execコマンドより後のコマンドは実行しないで,完了した外部コマンドの終了コードがジョブ定義スクリプトの終了コードになります。
(c) 非同期実行プロセスをwaitすることを通知するメッセージ
adshexecコマンド起動時,ジョブ終了時に非同期実行プロセスをwaitすることを通知するメッセージKNAX7901-Iが出力されます。このメッセージは,通常実行時はジョブ実行ログ,システム実行ログおよび標準エラー出力へ出力されます。デバッグ実行時は,標準エラー出力へ出力されます。
(d) 非同期実行プロセスが停止状態になっている場合のジョブの動作【UNIX限定】
非同期実行プロセスがSIGSTOPなどを受信して停止状態になっている場合,ジョブ終了時に子プロセスまたは子孫プロセスに対してSIGHUPとSIGCONTを送信します。送信が完了したあと,1秒後にジョブの後処理を実施します。
ジョブの入力モードによって,SIGHUPとSIGCONTの送信方法が次のとおり異なります。
-
端末入力モード
adshexecコマンドの子プロセスだけにSIGHUPとSIGCONTを送信します。adshexecコマンドの孫プロセス以下には,SIGHUPとSIGCONTを送信しません。孫プロセス以下が残った場合は,残ってしまったプロセスのプロセスIDをpsコマンドで確認し,killコマンドを使用して手動で終了させてください。
-
非端末入力モード
adshexecコマンドの子孫プロセスにSIGHUPとSIGCONTを送信します。