5.8.8 ジョブ,ジョブステップおよびコマンドの終了コード
終了コードおよび実行結果の正常・異常について説明します。
(1) ジョブの終了コード
ジョブの終了コードは最後に実行したジョブ定義スクリプトの終了コードになります。
JP1/Advanced Shellはジョブの実行結果について正常・異常を区別しません。終了コードをJP1/AJSなどにそのまま返します。
JP1/AJSからジョブを実行した場合,JP1/AJS - Viewなどで確認できるJP1/AJSのジョブの終了コードは,adshexecコマンドの終了コードではなく,JP1/AJSが定める終了コードとなることがあります。この場合,JP1/AJSのジョブの終了コードと,ジョブ実行ログなどに出力されるJP1/Advanced Shellのジョブの終了コードとは,値が異なることがあります。
- 例
-
JP1/AJSから起動したUNIX版のadshexecコマンドがSIGINTを受信した場合,JP1/Advanced Shellのジョブの終了コードは130になりますが,JP1/AJSのジョブの終了コードは-1になります。
ただし,ジョブの中でエラーが発生していた場合は,エラーメッセージを出力します。
(2) ジョブステップの終了コード
ジョブステップの終了コードは,ジョブステップ正常ブロック内で最後に実行したコマンドの終了コードになります。ただし,ジョブステップエラーブロックでexitコマンドに引数を指定して実行すると,exitコマンドの引数をジョブステップの終了コードにできます。それ以外でジョブステップエラーブロック内で実行したコマンドの終了コードは,ジョブステップの終了コードに影響しません。ジョブステップの正常終了およびエラー終了について説明します。
-
ジョブステップの正常終了
ジョブステップ正常ブロック内で最後に実行したコマンドが正常終了しています。
-
ジョブステップのエラー終了
ジョブステップ正常ブロック内で最後に実行したコマンドがエラー終了しています。
(3) 外部コマンドの終了コード
外部コマンドの終了コードは,各コマンドで定められた終了コードになります。
外部コマンドがリターンできる値の範囲は,プラットフォームや外部コマンドを記述したプログラム言語の言語仕様などによって異なりますが,0〜255とすることを推奨します。この範囲を超えた場合,JP1/Advanced Shellでは,次に示す値を外部コマンドの終了コードとして扱います。
- 【UNIX限定】
-
外部コマンドがリターンする値の下位8ビット
- 【Windows限定】
-
-
外部コマンドがリターンする値が0以上の場合,値の下位8ビット
-
外部コマンドがリターンする値が0未満の場合,255
-
外部コマンドで例外※が発生して終了した場合,例外コードの下位8ビット
- 注※
-
例外として扱う例外コードと意味は次のとおりです。
表5‒38 例外として扱う例外コードと意味 項番
例外コード
意味
1
0xC0000005
スレッドがアクセス権を持っていない仮想アドレスへアクセスしようとしました。
2
0x80000003
ブレークポイントに到達しました。
3
0x80000002
メモリアクセスに関してアライメント規約の存在するハードウェア上で,ミスアライメントされたデータにアクセスしました(例えば,16ビット値が2バイト境界にまたがったり,32ビット値が4バイト境界にまたがったりすることはできません)。
4
0x80000004
トレースまたはシングルステップ機構による1命令ごとの実行です。
5
0xC000008C
スレッドが配列の範囲外にアクセスしようとしたことが,ハードウェアによって検出されました。
6
0xC000008D
浮動小数点演算で,オペランドのうち少なくとも1つが非正規化数(普通の浮動小数点フォーマットでは表現できないほど小さな値)です。
7
0xC000008E
スレッドが,浮動小数点演算で0による除算をしようとしました。
8
0xC000008F
浮動小数点演算の結果,正確な値が計算できませんでした。
9
0xC0000030
この表に列挙した以外の浮動小数点演算の例外です。
10
0xC0000091
浮動小数点演算の結果,指数部の値が制限範囲を超えました。
11
0xC0000032
浮動小数点演算の結果,スタックがオーバーフローまたはアンダーフローを起こしました。
12
0xC0000033
浮動小数点演算の結果,指数部の値が制限範囲を下回りました。
13
0xC0000094
スレッドが,整数演算で0による除算をしようとしました。
14
0xC0000035
整数演算の結果,オーバーフローが発生しました。
15
0xC0000096
現在のマシンモードでは実行できない命令(特権命令)を実行しようとしました。
16
0xC0000025
継続できない例外を起こした命令に対して,再実行を試みました。
-
外部コマンドの実行結果が次の表のどれかに該当する場合,その外部コマンドがエラー終了したと見なします。
外部コマンド実行結果 |
終了コード |
---|---|
外部コマンドの終了コードが0ではない場合(successRC属性,CMDRC_THRESHOLD_USE_PRESETパラメーター,CMDRC_THRESHOLD_DEFINEパラメーターで値を変更可能) |
外部コマンドの終了コード |
外部コマンドがシグナル終了した場合 |
外部コマンドが定めるシグナル終了時の終了コード※ |
指定された外部コマンドに実行権限がなく,実行できなかった場合 |
126 |
指定された外部コマンドが存在しないで,実行できなかった場合 |
127 |
なお,#-adsh_rc_ignoreコマンドで指定した外部コマンドは,終了コードに関係なくエラーにはなりません。
(4) 組み込みコマンドの終了コード
組み込みコマンドの終了コードは,各コマンドで定められた終了コードになります。組み込みコマンドの場合,実行結果の正常・エラーは,終了コードの値ではなく各コマンドの実行時にエラーとなる現象が発生したかどうかで判定されます。ただし,#-adsh_rc_ignoreコマンドで指定した組み込みコマンドは,コマンドの実行結果に関係なく,常に正常終了します。
各コマンドが正常・エラーとなる条件については,「9. ジョブ定義スクリプトのコマンドおよび制御文」に記載している各コマンドの終了コードをご確認ください。
(5) 注意事項
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属性による指定は,ジョブステップ内のすべてのコマンドに対して有効となります。