Hitachi

JP1 Version 11 JP1/Advanced Shell 


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を指定することで,先行処理の成功・エラーに関係なく常に実行するジョブステップを定義できます。