終了コードの識別とそれぞれの意味

CircleCI (または、他の Linux/Unix 環境) でビルド中に、プロセスが終了したためにビルドが失敗することがあります。 この投稿では、これらのコードの意味と、それが引き起こされた原因の可能性について解説します。

exit コード 137 が発生し、ただちに回答が必要な場合は、このリンクを使用してください。

 

失敗したビルドのほとんどは、最後にシェルがコード 1 で終了します。 これは catch-all エラーで、単に何かが失敗したことだけを意味しています。 ただし、コンソールでさらに検索すると、ほとんどの場合は、プロセスの終了時に独自のステータスコードを返しています。

 

終了コードとは

Linux / Unix ベースのシステムでプロセスが終了するとき、親プロセス (通常はシェル) にステータスコードを返すことがあります。 プロセスが問題なく終了した場合は 0 を返すのが一般的な方法で、これよりも大きな整数は、何かの条件での失敗を意味しています。

 

"高度な Bash スクリプト処理ガイド" は、ほとんどのアプリケーションで標準となっている予約ステータスコードについて、詳しく説明している資料です。

 

終了コード 意味 コメント
1 一般的なエラーの catch-all let "var1 = 1/0" "divide by zero" や、他の許容されない操作を含む各種のエラー
2 シェル内蔵機能の誤使用 (Bash ドキュメントに従う) empty_function() {} キーワードが見つからないまたはコマンドが存在しない、またはアクセス許可の問題 (および、バイナリファイル比較の失敗時に diff が返すリターンコード)
126 起動されたコマンドが実行できない /dev/null アクセス許可の問題、またはコマンドが実行形式ファイルでない
127 "command not found" illegal_command $PATH の問題、またはタイプミス
128 exit への無効な引数 exit 3.14159 exit 0 ~ 255 の範囲の整数値のみを引数として受け付けます (最初の脚注を参照)
128+n 致命的なエラー信号 "n" kill -9スクリプトの $PPID $?137 (128 + 9) を返す
130 スクリプトが Control-C により終了された Ctl-C Control-C は致命的なエラー信号 2 (130 = 128 + 2、上記参照)
255* 終了ステータスの範囲外 exit -1 exit 0 ~ 255 の範囲の整数値のみを引数として受け付けます

 

先ほども触れ、このチャートにもあるように、すべての場合における一般的なエラーでは、終了コード 1 になります。

受け取った 終了コードが 128 より大きい場合、致命的なエラー信号を受け取ったことになります。 Linux にも、いくつかの標準信号があります。 128 よりも大きなエラーが発生した場合、エラー信号を識別するには、その番号から 128 を引きます。

 

標準の Linux 信号

標準信号のリストについては、信号のマニュアルページを参照してください。 各信号のリストには、致命的なエラーを受け取った理由について詳しい情報が記載されています。

 

Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
SIGHUP 1 Term Hangup detected on controlling terminal
 or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating-point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
 readers; see pipe(7)
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at terminal
SIGTTIN 21,21,26 Stop Terminal input for background process
SIGTTOU 22,22,27 Stop Terminal output for background process

 

このため、終了コード 137 を受け取った場合、信号を識別するには、上述のように 128 を引く必要があります。

137 - 128 = 9 または SIGKILL

CircleCI 内では、'SGKILL' は通常、ビルドが RAM などのリソース割り当てを超過したため終了されたことを示します。

 

 

この記事は役に立ちましたか?
2人中2人がこの記事が役に立ったと言っています

コメント

0件のコメント

ログインしてコメントを残してください。