Hitachi

Advanced Shell 


5.8.8 ジョブ,ジョブステップおよびコマンドの終了コード

終了コードおよび実行結果の正常・異常について説明します。

〈この項の構成〉

(1) ジョブの終了コード

ジョブの終了コードは最後に実行したジョブ定義スクリプトの終了コードになります。

Advanced Shellはジョブの実行結果について正常・異常を区別しません。終了コードをJP1/AJSなどにそのまま返します。

JP1/AJSからジョブを実行した場合,JP1/AJS - Viewなどで確認できるJP1/AJSのジョブの終了コードは,adshexecコマンドの終了コードではなく,JP1/AJSが定める終了コードとなることがあります。この場合,JP1/AJSのジョブの終了コードと,ジョブ実行ログなどに出力されAdvanced Shellのジョブの終了コードとは,値が異なることがあります。

JP1/AJSから起動したUNIX版のadshexecコマンドがSIGINTを受信した場合Advanced Shellのジョブの終了コードは130になりますが,JP1/AJSのジョブの終了コードは-1になります。

ただし,ジョブの中でエラーが発生していた場合は,エラーメッセージを出力します。

(2) ジョブステップの終了コード

ジョブステップの終了コードは,ジョブステップ正常ブロック内で最後に実行したコマンドの終了コードになります。ただし,ジョブステップエラーブロックでexitコマンドに引数を指定して実行すると,exitコマンドの引数をジョブステップの終了コードにできます。それ以外でジョブステップエラーブロック内で実行したコマンドの終了コードは,ジョブステップの終了コードに影響しません。ジョブステップの正常終了およびエラー終了について説明します。

(3) 外部コマンドの終了コード

外部コマンドの終了コードは,各コマンドで定められた終了コードになります。

外部コマンドがリターンできる値の範囲は,プラットフォームや外部コマンドを記述したプログラム言語の言語仕様などによって異なりますが,0255とすることを推奨します。この範囲を超えた場合,ジョブコントローラでは,次に示す値を外部コマンドの終了コードとして扱います。

【UNIX限定】

外部コマンドがリターンする値の下位8ビット

【Windows限定】
  • 外部コマンドがリターンする値が0以上の場合,値の下位8ビット

  • 外部コマンドがリターンする値が0未満の場合,255

  • 外部コマンドで例外が発生して終了した場合,例外コードの下位8ビット

注※

例外として扱う例外コードと意味は次のとおりです。

表5‒44 例外として扱う例外コードと意味

項番

例外コード

例外が発生した場合の外部コマンドの終了コード

意味

1

0xC0000005

5

スレッドがアクセス権を持っていない仮想アドレスへアクセスしようとしました。

2

0x80000003

3

ブレークポイントに到達しました。

3

0x80000002

2

メモリアクセスに関してアライメント規約の存在するハードウェア上で,ミスアライメントされたデータにアクセスしました(例えば,16ビット値が2バイト境界にまたがったり,32ビット値が4バイト境界にまたがったりすることはできません)。

4

0x80000004

4

トレースまたはシングルステップ機構による1命令ごとの実行です。

5

0xC000008C

140

スレッドが配列の範囲外にアクセスしようとしたことが,ハードウェアによって検出されました。

6

0xC000008D

141

浮動小数点演算で,オペランドのうち少なくとも1つが非正規化数(普通の浮動小数点フォーマットでは表現できないほど小さな値)です。

7

0xC000008E

142

スレッドが,浮動小数点演算で0による除算をしようとしました。

8

0xC000008F

143

浮動小数点演算の結果,正確な値が計算できませんでした。

9

0xC0000030

48

この表に列挙した以外の浮動小数点演算の例外です。

10

0xC0000091

145

浮動小数点演算の結果,指数部の値が制限範囲を超えました。

11

0xC0000032

50

浮動小数点演算の結果,スタックがオーバーフローまたはアンダーフローを起こしました。

12

0xC0000033

51

浮動小数点演算の結果,指数部の値が制限範囲を下回りました。

13

0xC0000094

148

スレッドが,整数演算で0による除算をしようとしました。

14

0xC0000035

53

整数演算の結果,オーバーフローが発生しました。

15

0xC0000096

150

現在のマシンモードでは実行できない命令(特権命令)を実行しようとしました。

16

0xC0000025

37

継続できない例外を起こした命令に対して,再実行を試みました。

例えば外部コマンドがリターンする値が512の場合,外部コマンドの終了コードは0になります。また,ジョブコントローラは,外部コマンドが正常終了したものとして扱います。

'E:\bin\uap01.exe'         ←uap01.exeがリターンした値は512
if [ $? -ne 0 ]            ←下位8ビットを終了コードと扱うため,終了コードは0
then
  exit 2                   ←終了コードは0のため,exit2は実行されない
fi

外部コマンドがリターンする値が0255以外の場合は,シェル変数ADSH_RC_EXTERNALを使用して,外部コマンドの実行結果を取得してください。

'E:\bin\uap01.exe'             ←uap01.exeがリターンした値は512
if [ $ADSH_RC_EXTERNAL -ne 0 ] ←シェル変数ADSH_RC_EXTERNALには外部コマンドがリターンした
                                 値が設定される
then
  exit 2                       ←ADSH_RC_EXTERNALの値は512のため,exit 2は実行される
fi

詳細は「5.5.4 外部コマンドの終了コードが設定されるシェル変数【Windows限定】」を参照してください。

外部コマンドの実行結果が次の表のどれかに該当する場合,その外部コマンドがエラー終了したと見なします。

外部コマンド実行結果

終了コード

外部コマンドの終了コードが0ではない場合(successRC属性,CMDRC_THRESHOLD_USE_PRESETパラメーター,CMDRC_THRESHOLD_DEFINEパラメーター,adshcmdrcコマンドで値を変更できる)

外部コマンドの終了コード

外部コマンドがシグナル終了した場合

外部コマンドが定めるシグナル終了時の終了コード

指定された外部コマンドに実行権限がなく,実行できなかった場合

126

指定された外部コマンドが存在しないで,実行できなかった場合

127

注※

シグナルを受信すると,受信したシグナルの種別を示す文字列を標準エラー出力に出力することがあります。

なお,#-adsh_rc_ignoreコマンドで指定した外部コマンドは,終了コードに関係なくエラーにはなりません。

(4) 組み込みコマンドの終了コード

組み込みコマンドの終了コードは,各コマンドで定められた終了コードになります。組み込みコマンドの場合,実行結果の正常・エラーは,終了コードの値ではなく各コマンドの実行時にエラーとなる現象が発生したかどうかで判定されます。ただし,#-adsh_rc_ignoreコマンドで指定した組み込みコマンドは,コマンドの実行結果に関係なく,常に正常終了します。

各コマンドが正常・エラーとなる条件については,「9. ジョブ定義スクリプトのコマンドおよび制御文」に記載している各コマンドの終了コードをご確認ください。

(5) 関数の終了コード

関数では,関数内で最後に実行したコマンドの終了コードが関数の終了コードになります。CMDRC_CMDGRP_CHECKパラメータにFUNCTIONを指定して実行することで,関数の終了コードに従ってジョブおよびジョブステップのエラー判定ができるようになります。

CMDRC_CMDGRP_CHECKパラメータの詳細については,「7.3.9 CMDRC_CMDGRP_CHECKパラメーター(関数の終了コードに従ってジョブおよびジョブステップのエラー判定をする)」を,関数の詳細については「5.1.4 関数」を参照してください。

(6) 注意事項

UNIX互換コマンドおよびユーザーが作成したコマンドは,正常終了してもコマンドの終了コードが0ではない場合があります。例えば,diffコマンドは比較したファイルが異なるとき,終了コードが1となります。

このようなコマンドについては,正常かエラーかが正しく判定されるように,次の方法で記述してください。UNIX互換コマンドの終了コードの詳細については,「8.4 UNIX互換コマンド」を参照してください。

(a) 環境設定パラメーターで指定する場合

  • UNIX互換コマンドが正常かエラーかを正しく判定するには,CMDRC_THRESHOLD_USE_PRESETパラメーターにENABLEを指定します。

  • OS提供のコマンドまたはユーザーが作成したコマンドが正常かエラーかを正しく判定するには,CMDRC_THRESHOLD_DEFINEパラメーターで指定します。

(b) ジョブ定義スクリプトで指定する場合

  • コマンドの実行結果を常に正常終了とする場合は,#-adsh_rc_ignoreコマンドの引数に,正常終了とするコマンド名を指定します。

  • 正常かエラーかをコマンドの仕様に従って判定する場合は,対象コマンドをジョブステップ内に定義し,successRC属性で正常終了となる終了コードを指定します。successRC属性による指定は,ジョブステップ内のすべてのコマンドに対して有効となります。

  • ジョブステップ内またはジョブステップ外に指定した対象コマンドに対して,正常かエラーかをコマンドの仕様に従って判定する場合は,adshcmdrcコマンドの引数に対象コマンドと正常終了と見なす終了コードしきい値を指定します。