5.8.3 ジョブステップを定義する
#-adsh_stepで始まるジョブステップ定義コマンドを使用して,ジョブ定義スクリプトの一部分を,ジョブステップとしてグループ化します。ジョブステップとは,グループ化した一まとまりのコマンド群のことです。
- 〈この項の構成〉
(1) グループ化の方法
ジョブステップとして通常実行するコマンド群は,#-adsh_step_startコマンドから#-adsh_step_errorコマンドまたは#-adsh_step_endコマンドまでのブロック内に記述します。このブロックをジョブステップ正常ブロックと呼びます。
ジョブステップ正常ブロック内の最後のコマンドがエラー終了した場合にだけ実行するコマンド群を,#-adsh_step_errorコマンドから#-adsh_step_endコマンドまでのブロック内に記述します。このブロックをジョブステップエラーブロックと呼びます。
(2) ジョブステップ実行の流れ
ジョブステップ実行の流れを,次に示します。
-
エラー終了した先行ジョブステップやエラー終了したコマンドの有無とrun属性の指定によって,ジョブステップをスキップするかどうかを決定します。run属性については,「9.5 スクリプト拡張コマンド」の「#-adsh_step_startコマンド,#-adsh_step_errorコマンド,#-adsh_step_endコマンド(ジョブステップを定義する)」を参照してください。
-
ジョブステップ正常ブロック内のコマンドを順に実行します。コマンドがエラー終了した場合,onError属性がstopのときは,後続コマンドを実行しないでジョブステップ正常ブロックを抜けます。onError属性がcontのときは後続コマンドを実行してからジョブステップ正常ブロックを抜けます。
-
#-adsh_step_errorが定義されている場合,ジョブステップ正常ブロック内で最後に実行したコマンドがエラー終了したときだけ,ジョブステップエラーブロック内のコマンドを順に実行します。
(3) ジョブステップ内でだけ有効なシェル変数の宣言
stepVar属性を指定すると,このジョブステップ内でだけ有効なシェル変数を宣言できます。宣言したシェル変数をエクスポートしても,ジョブステップ内でだけエクスポートされた状態になります。
ジョブステップ開始時,JP1/Advanced Shellが自動的にシェル変数を未定義の状態とします。ただし,ジョブステップ内で有効なシェル変数としてPATHを指定した場合は,ジョブステップ開始前の値を引き継ぎます。
ジョブステップ終了時,JP1/Advanced Shellが自動的にシェル変数をジョブステップ開始時の状態に戻します。
宣言するシェル変数は,ジョブステップ外のシェル変数と同名のシェル変数を宣言できます。その場合の注意事項を次に示します。
-
宣言したシェル変数は,ジョブステップ外の同名シェル変数とは,まったく別の変数として扱います。
-
ジョブステップ開始時は,宣言したシェル変数は未定義状態になります。ジョブステップ外の同名シェル変数の値は,別のシェル変数として扱うため引き継ぎません。
-
ジョブステップ外の同名シェル変数を,ジョブステップ内で参照・更新できません。
-
ジョブステップ終了後は,再びジョブステップ外の同名シェル変数が参照・更新できます。
使用例を次に示します。
- ジョブ定義スクリプトファイルの使用例
01: VAL1=AAA 02: echo "ステップ開始前(ステップ外)です" 03: echo "beforeStepVar1="$VAL1 04: echo "beforeStepVar2="$VAL2 05: 06: #-adsh_step_start S1 -stepVar VAL1,VAL2 07: echo "ステップを開始しました" 08: echo "startStepVar1="$VAL1 09: echo "startStepVar2="$VAL2 10: VAL1=XXX 11: VAL2=YYY 12: echo "endStepVar1="$VAL1 13: echo "endStepVar2="$VAL2 14: #-adsh_step_end 15: 16: echo "ステップを終了しました" 17: echo "afterStepVar1="$VAL1 18: echo "afterStepVar2="$VAL2
ジョブステップ外に同名シェル変数が存在するVAL1と,ジョブステップ外に同名シェル変数が存在しないVAL2を宣言しています。
実行結果を次に示します。
ステップ開始前(ステップ外)です beforeStepVar1=AAA ←ジョブステップ外のVAL1を参照。ジョブステップ内のVAL1とは別物 beforeStepVar2= ←ジョブステップ外のVAL2を参照するが,存在しない ステップを開始しました startStepVar1= ←ジョブステップ内のVAL1を参照。ジョブステップ外のVAL1とは別物 startStepVar2= endStepVar1=XXX endStepVar2=YYY ステップを終了しました afterStepVar1=AAA ←ジョブステップ外のVAL1を参照。ジョブステップ内のVAL1とは別物 afterStepVar2= ←ジョブステップ外のVAL2を参照するが,存在しない
ジョブステップ内でだけ有効なシェル変数にPATHを指定すると,PATHシェル変数へのパス追加をジョブステップローカルに行えます。PATHの初期値はジョブステップ開始前の値を引き継ぎます。
ジョブステップローカルなPATHシェル変数へのパス追加の例を次に示します。ジョブ定義スクリプト実行開始時のPATHシェル変数の値を,a:bと仮定します。
#-adsh_job J1 →1. cmdA PATH=x:$PATH →2. cmdB #-adsh_step_start S1 -stepVar PATH →3. cmdC PATH=y:$PATH →4. cmdD #-adsh_step_end →5.
ジョブステップローカルなPATHシェル変数へのパス追加の例の番号は,次に示す説明の順番と対応しています。
-
PATHの初期値は「a:b」とする。
-
ジョブステップ内で有効。PATHの値は「x:a:b」になる。
-
stepVarにPATHを指定する。シェル変数は削除されないで,値は「x:a:b」のまま。
-
ジョブステップ内で有効。PATHの値は「y:x:a:b」になる。
-
PATHをジョブステップ開始時の値に戻す。PATHの値は「x:a:b」になる。
#-adsh_path_varコマンドを使用すると,WindowsとUNIX間でディレクトリのパスを変換するためのシェル変数を定義して使用できます。機能の詳細については,「5.8.5 パス名を扱うシェル変数を定義する」を参照してください。
(4) ジョブステップエラー時のジョブステップ終了コードの指定
ジョブステップでエラーが発生した場合,ジョブステップの終了コードを任意に設定できます。終了コードを任意に設定するには,ジョブステップエラーブロック内でexitコマンドの引数に任意の終了コードを指定して実行します。このとき,exitコマンドによってジョブが終了するため,ジョブの終了コードもexitコマンドの引数に指定した値となります。
ジョブステップエラーブロック内で.(ドット)コマンドまたは#-adsh_scriptコマンドを用いて外部スクリプトを呼び出し,呼び出した外部スクリプト内でexitコマンドに引数を指定して実行した場合も,引数に指定した値がジョブステップの終了コードになります。
ジョブステップエラーブロック内でexitコマンドに引数を指定して実行する例を次に示します。
#-adsh_step_start STEP1 cmdA cmdB ←終了コード1でエラー終了 cmdC #-adsh_step_error exit 4 ←ジョブステップはエラー終了し,exitの引数4が #-adsh_step_end ジョブステップの終了コードになる
ジョブステップエラーブロック内でexitコマンドに引数を指定しないで実行した場合は,ジョブステップ正常ブロック内で最後に実行したコマンドの終了コードがジョブステップの終了コードとなります。
ジョブステップエラーブロック内でexitコマンドに引数を指定しないで実行する例を次に示します。
#-adsh_step_start STEP1 cmdA cmdB ←終了コード1でエラー終了 cmdC #-adsh_step_error exit ←ジョブステップはエラー終了し,exitの引数なしのため, #-adsh_step_end cmdBの終了コード1がジョブステップの終了コードになる
(5) ジョブステップの実行例
すべてのコマンドが正常終了する場合と,途中でコマンドがエラー終了する場合のジョブ定義スクリプトファイルの実行例を次に示します。
-
すべてのコマンドが正常終了する場合の実行例
#!/opt/jp1as/bin/adshexec #-adsh_job JOB001 #-adsh_step_start STEP001 command1 ←実行する command2 ←実行する command3 ←実行する #-adsh_step_error command4 ←実行しない command5 ←実行しない #-adsh_step_end #-adsh_step_start STEP002 command6 ←実行する #-adsh_step_end #-adsh_step_start STEP003 -run abnormal command7 ←実行しない #-adsh_step_end #-adsh_step_start STEP004 -run always command8 ←実行する #-adsh_step_end
-
command2がエラー終了する場合の実行例(onError属性がstop)
#!/opt/jp1as/bin/adshexec #-adsh_job JOB001 #-adsh_step_start STEP001 -onError stop command1 ←実行する command2 ←実行する(エラー終了) command3 ←実行しない #-adsh_step_error command4 ←実行する command5 ←実行する #-adsh_step_end #-adsh_step_start STEP002 command6 ←実行しない #-adsh_step_end #-adsh_step_start STEP003 -run abnormal command7 ←実行する #-adsh_step_end #-adsh_step_start STEP004 -run always command8 ←実行する #-adsh_step_end
-
command2がエラー終了する場合の実行例(onError属性がcont)
#!/opt/jp1as/bin/adshexec #-adsh_job JOB001 #-adsh_step_start STEP001 -onError cont command1 ←実行する command2 ←実行する(エラー終了) command3 ←実行する #-adsh_step_error command4 ←実行しない command5 ←実行しない #-adsh_step_end #-adsh_step_start STEP002 command6 ←実行する #-adsh_step_end #-adsh_step_start STEP003 -run abnormal command7 ←実行しない #-adsh_step_end #-adsh_step_start STEP004 -run always command8 ←実行する #-adsh_step_end
ジョブステップ外のコマンドがエラーとなった場合,後続ジョブ定義スクリプトは次のようになります。
-
後続のジョブステップ外コマンドは実行します。
-
後続のrun属性がnormalのジョブステップは実行しません。
-
後続のrun属性がabnormalまたはalwaysのジョブステップは実行します。
実行例を次に示します。
#-adsh_job CMD_ERROR echo "Job start." cd -x #エラーとなるコマンド ←このコマンドがエラーとなる echo "Job end." ←ジョブステップ外のコマンドは実行する #-adsh_step_start STEP01 -run normal ←run normal指定のジョブステップは実行しない echo "command in step" #-adsh_step_end #-adsh_step_start STEP02 -run abnormal ←run abnormal指定のジョブステップは実行する echo "command in step" #-adsh_step_end #-adsh_step_start STEP03 -run always ←run always指定のジョブステップは実行する echo "command in step" #-adsh_step_end
ジョブステップがエラーとなった場合,後続ジョブステップを実行するかどうかは後続ジョブステップのrun属性によって決定します。しかし,後続のジョブステップ外コマンドは実行しません。実行例を次に示します。
#-adsh_job STEP_ERROR #-adsh_step_start STEP01 echo "Step start." cd -x #エラーとなるコマンド echo "Step end." #-adsh_step_end ←ジョブステップはエラーで終了する echo "Job end." ←先行ジョブステップがエラーの場合,後続のジョブステップ外コマンドは 実行しない
ジョブステップエラーブロック内で実行したコマンドの終了コードは,ジョブステップの終了コードには影響しません。ジョブステップ正常ブロック内で最後に実行したコマンドの終了コードが,ジョブステップの終了コードになります。実行例を次に示します。
#-adsh_job STEP_ERRBLK_RC #-adsh_step_start STEP01 echo "Step start." cd -x #rc=1でエラーとなるコマンド ←この結果がジョブステップの終了コードになる echo "Step end." #-adsh_step_error echo "step error block" #rc=0となるコマンド ←ジョブステップのrcに影響を与えない #-adsh_step_end ←ジョブステップはcdコマンドのエラー結果が反映され,rc=1で終了する
(6) 関数,trapコマンドとの関係
関数およびtrapコマンドのアクションは,それらを定義した場所には関係なく,実行された場所によってジョブステップ内外のどちらで実行されたかが決まります。