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がエラーになった場合のログ出力結果を次に示します。
- ジョブ実行ログ(抜粋)
KNAX0091-I ADSH000001 Job started. KNAX7901-I adshexec waits for all asynchronous processes at the end of the job. KNAX7902-I adshexec will run in non-tty stdin mode. KNAX0092-I ADSH000001.S01 Step started. KNAX6112-I Command /bin/progA(line=4) succeeded. rc=0 E-Time=0.000s C-Time=0.000s KNAX6597-I ADSH000001.S01 Step succeeded. rc=0 E-Time=0.007s C-Time=0.000s KNAX0092-I ADSH000001.S02 Step started. KNAX1601-I ADSH000001.S02 Step allocated. KNAX6409-I File TEMP is allocated as "create". path=/tmp/TEMP_000277_ ADSH000001_G-Uoia KNAX6521-E Command /bin/progB(line=9) failed. rc=1 E-Time=0.002s C-Time=0.000s …(1) KNAX6410-I File TEMP is deallocated as "del". path=/TEMP_000277_ ADSH000001_G-Uoia KNAX1604-I /tmp/TEMP_000277_ ADSH000001_G-Uoia is deleted. …(2) KNAX6596-E ADSH000001.S02 Step failed. rc=1 E-Time=0.022s C-Time=0.000s KNAX0101-E ADSH000001 An error occurred during execution of job. KNAX0098-I ADSH000001 Job ended. rc=1 E-Time=0.045s C-Time=0.010s …(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)について
-
ジョブステップを使用しない場合,特定のコマンドの終了コードで処理を分岐するために,コマンドの終了コードを個別のシェル変数に格納しておく必要があります。
ジョブステップを使用する場合,JP1/Advanced Shellが自動的に設定する各ジョブステップの終了コードを参照できます。
- (3)について
-
ジョブステップを使用しない場合,コマンドの終了コードの最大値を参照するには,コマンドの実行ごとに最大値を更新する必要があります。
ジョブステップを使用する場合,JP1/Advanced Shellが自動的に設定する各ジョブステップの終了コード最大値を参照できます。
- (4)について
-
ジョブステップを使用しない場合,コマンドの終了コードがしきい値を超えたことによってスクリプトの実行を終了するには,コマンドの実行ごとにしきい値を判断する必要があります。
ジョブステップを使用する場合,スクリプト拡張コマンドの#-adsh_job_stopコマンドを使用すると,しきい値を宣言するだけでジョブステップの終了コードを自動的に監視できます。
- (5)について
-
ジョブステップを使用しない場合,コマンドの終了コードによって,後続処理を実行するかどうかの判定を行って実行を制御します。
ジョブステップを使用する場合,スクリプト拡張コマンド#-adsh_step_startのrun属性にabnormalを指定することで,先行処理でエラーが発生した場合だけ実行するジョブステップを定義できます。
- (6)について
-
ジョブステップを使用する場合,スクリプト拡張コマンド#-adsh_step_startのrun属性にalwaysを指定することで,先行処理の成功・エラーに関係なく常に実行するジョブステップを定義できます。