3.1.3 ジョブステップ
ジョブステップとは,ジョブを構成する実行の単位で,ジョブ定義スクリプトの一部分を,一まとまりのコマンド群としてグループ化したものです。通常ファイルや一時ファイルの割り当てをする場合,ジョブステップ内でだけ有効なファイルを定義できます。このようなファイルは,割り当てが行われたジョブステップの終了時に後処理を行います。
幾つかのジョブステップは互いに関連を持っていて,前のジョブステップが正しく処理されないと次のジョブステップの実行が意味を持たない場合があります。この場合,ジョブステップの実行条件を指定して,処理をスキップすることもできます。
ジョブステップは,次のような目的で使用します。
コマンドやプログラムのエラー処理を自動化する
ジョブステップ単位でシェルスクリプトの実行を制御する
(1) コマンドエラー時の終了処理およびログ出力自動化
従来のスクリプトでは,コマンドの実行ごとに終了コードを判定し,エラーメッセージ出力,一時ファイルの削除,およびその他のエラー処理を作り込む必要がありました。
ジョブステップを使用すると,ジョブステップ内で実行するコマンドの終了コードを監視し,エラーメッセージの出力,一時ファイルの削除,あらかじめ定義したエラー処理の実行などを行うことができます。
ジョブステップを使用して,エラー時の終了処理やログ出力を自動化したスクリプトの例を次に示します。
- ジョブステップを使用する場合と使用しない場合との比較
- ジョブステップを使用しない場合
01 progA 02 ret=$? 03 if [[ $ret != 0 ]]; then …(1) 04 echo "progA error" …(1) 05 exit $ret …(1) 06 fi …(1) 07 08 TEMP="/tmp/tempfile" 09 10 progB ${INFILE_B} ${TEMP} 11 ret=$? 12 if [[ $ret != 0 ]]; then 13 echo "progB error" 14 rm ${TEMP} …(2) 15 exit $ret 16 fi 17 18 progC ${TEMP} ${OUTFILE_C} 19 ret=$? 20 if [[ $ret != 0 ]]; then 21 echo "progC error" 22 fi 23 24 rm ${TEMP} …(2) 25 exit $ret
- ジョブステップを使用する場合
01 #-adsh_job J01 02 03 #-adsh_step_start S01 …(1) 04 progA 05 #-adsh_step_end 06 07 #-adsh_step_start S02 08 #-adsh_file_temp TEMP …(2) 09 progB ${INFILE_B} ${TEMP} 10 progC ${TEMP} ${OUTFILE_C} 11 #-adsh_step_end
スクリプト例の(1)および(2)について次に解説します。
- (1)について
ジョブステップを使用しない場合,コマンドを実行するたびにエラー判定をし,エラーメッセージ出力処理やスクリプトの中断処理を記述する必要があります。
ジョブステップを使用する場合,コマンド群をジョブステップとして定義すれば,エラーが発生した時点でエラーメッセージを自動出力し,後続のコマンドを実行しないでジョブステップを終了できます。
- (2)について
ジョブステップを使用しない場合,作成した一時ファイルの削除処理をユーザーが漏れなく作り込む必要があります。
ジョブステップを使用する場合,JP1/Advanced Shellの一時ファイル機能でそのジョブステップ用に割り当てた一時ファイルを,ジョブステップ終了時に自動的に削除します。
ジョブステップを使用すると,上記(1)(2)などの処理を自動化できます。progBがエラーになった場合のログ出力結果を次に示します。
- ジョブ実行ログ(抜粋)
******** ジョブコントローラのメッセージ出力 ******** 17:16:12 000521 KNAX0091-I J01 ジョブが開始しました。 17:16:12 000521 KNAX7901-I ジョブコントローラは,ジョブ終了時にすべての非同期実行プロセスの完了を待ちます。 17:16:12 000521 KNAX7902-I ジョブコントローラは,"端末入力モード"で動作します。 17:16:12 000521 KNAX0092-I J01.S01 ステップが開始しました。 17:16:12 000521 KNAX6116-I コマンド(./progA, 行番号=4)が正常終了しました。rc=0 E-Time=0.000s C-Time=0.000s 17:16:12 000521 KNAX6597-I J01.S01 ジョブステップが正常終了しました。rc=0 E-Time=0.001s C-Time=0.000s 17:16:12 000521 KNAX0092-I J01.S02 ステップが開始しました。 17:16:12 000521 KNAX1601-I J01.S02 ジョブステップのファイル割り当てを開始しました。 17:16:12 000521 KNAX6409-I ファイル環境変数定義名(TEMP)へ処理指定("create")に従ってファイルを割り当てました。path=/var/opt/jp1as/temp/TEMP_000521_J01_Z0XxJR 17:16:12 000521 KNAX6521-E コマンド(./progB, 行番号=9)がエラー終了しました。rc=1 E-Time=0.000s C-Time=0.000s …(1) 17:16:12 000521 KNAX6410-I ファイル環境変数定義名(TEMP)で割り当てたファイルを処理指定("del")に従って解放しました。path=/var/opt/jp1as/temp/TEMP_000521_J01_Z0XxJR 17:16:12 000521 KNAX1604-I 後処理指定値によってファイル(/var/opt/jp1as/temp/TEMP_000521_J01_Z0XxJR)を削除しました。 …(2) 17:16:12 000521 KNAX6596-E J01.S02 ジョブステップがエラー終了しました。rc=1 E-Time=0.002s C-Time=0.000s 17:16:12 000521 KNAX0101-E J01 ジョブを実行中にエラーが発生しました。 17:16:12 000521 KNAX0098-I J01 ジョブが終了しました。rc=1 E-Time=0.007s C-Time=0.000s …(3)
ジョブ実行ログの(1)〜(3)について次に解説します。
- (1)について
コマンドがエラーになった時点で,後続のコマンドは実行しません。
- (2)について
JP1/Advanced Shellの一時ファイル機能で割り当てた一時ファイルを自動的に削除します。
- (3)について
エラー処理で指定した終了コードでジョブを終了します。
(2) ジョブステップ単位での実行制御
関連するコマンド群をまとめてジョブステップとして定義し,ジョブステップの結果に応じてジョブの実行を制御できます。ジョブステップ単位で実行を制御するために,さまざまな機能を提供しています。
ジョブステップを使用して,ジョブステップ単位で実行を制御するスクリプトの例を次に示します。
- ジョブステップを使用する場合と使用しない場合との比較
- ジョブステップを使用しない場合
01 retmax=0 02 VAR=`progA` 03 export VAR 04 progB 05 06 tempVAR=$VAR …(1) 07 VAR=`progC` 08 progD 09 retD=$? …(2) 10 if [[ $retmax -lt $retD ]]; then 11 retmax=$retD …(3) 12 fi 13 VAR=$tempVAR …(1) 14 15 if [[ $retD -ge 16 ]]; then …(4) 16 exit $retD 17 fi 18 19 if [[ $retD -ne 0 ]]; then …(5) 20 if [[ $retD -eq 4 ]]; then …(2) 21 result="progD: warning" 22 else 23 result="progD: error" 24 fi 25 progE $result 26 retE=$? 27 if [[ $retmax -lt $retE ]]; then 28 retmax=$retE …(3) 29 fi 30 if [[ $retE -ge 16 ]]; then …(4) 31 exit $retE 32 fi 33 fi 34 35 progF …(6) 36 exit $retmax …(3)
- ジョブステップを使用する場合
01 #-adsh_job_stop 16: …(4) 02 VAR=`progA` 03 export VAR 04 progB 05 06 #-adsh_step_start S01 -stepVar VAR …(1) 07 VAR=`progC` 08 export VAR 09 progD 10 #-adsh_step_end 11 12 #-adsh_step_start S02 -run abnormal …(5) 13 if [[ $ADSH_STEPRC_S01 -eq 4 ]]; then …(2) 14 result="STEP01: warning" 15 else 16 result="STEP01: error" 17 fi 18 progE $result 19 #-adsh_step_end 20 21 #-adsh_step_start S03 -run always …(6) 22 progF 23 exit $ADSH_RC_STEPMAX …(3) 24 #-adsh_step_end
スクリプト例の(1)~(6)について次に解説します。
- (1)について
ジョブステップを使用しない場合,同一名のシェル変数を別の用途で使用するには,一時的に別の変数に値を退避するなどの処理が必要です。
ジョブステップを使用する場合,スクリプト拡張コマンド#-adsh_step_startのstepVar属性を使用すると,変数名を宣言するだけでジョブステップ内でだけ有効なシェル変数を使用できます。
- (2)について
ジョブステップを使用しない場合,特定のコマンドの終了コードで処理を分岐するために,コマンドの終了コードを個別のシェル変数に格納しておく必要があります。
ジョブステップを使用する場合,ジョブコントローラが自動的に設定する各ジョブステップの終了コードを参照できます。
- (3)について
ジョブステップを使用しない場合,コマンドの終了コードの最大値を参照するには,コマンドの実行ごとに最大値を更新する必要があります。
ジョブステップを使用する場合,ジョブコントローラが自動的に設定する各ジョブステップの終了コード最大値を参照できます。
- (4)について
ジョブステップを使用しない場合,コマンドの終了コードがしきい値を超えたことによってスクリプトの実行を終了するには,コマンドの実行ごとにしきい値を判断する必要があります。
ジョブステップを使用する場合,スクリプト拡張コマンドの#-adsh_job_stopコマンドを使用すると,しきい値を宣言するだけでジョブステップの終了コードを自動的に監視できます。
- (5)について
ジョブステップを使用しない場合,コマンドの終了コードによって,後続処理を実行するかどうかの判定を行って実行を制御します。
ジョブステップを使用する場合,スクリプト拡張コマンド#-adsh_step_startのrun属性にabnormalを指定することで,先行処理でエラーが発生した場合だけ実行するジョブステップを定義できます。
- (6)について
ジョブステップを使用する場合,スクリプト拡張コマンド#-adsh_step_startのrun属性にalwaysを指定することで,先行処理の成功・エラーに関係なく常に実行するジョブステップを定義できます。