208 件中 208 件のコード
操作に必要な特権がプロセスにありません。ファイルの所有者の変更、別のユーザーのプロセスへのシグナル送信、変更不可のファイル (chattr +i) の変更などです。EACCES と違い、ファイルのアクセス許可を変えても解決しません。root または該当する capability が必要です。
ファイルまたはディレクトリが存在しません。パスの途中のディレクトリがない場合、シンボリック リンクのリンク先が存在しない場合、スクリプトの #! 行のインタープリターがインストールされていない場合にも発生します。
その ID のプロセス、プロセス グループ、スレッドは存在しません。たとえば、すでに終了した PID に kill を実行した場合です。
システム コールが完了する前にシグナルによって中断されました。実際のエラーではありません。プログラムは呼び出しを再試行するか、SA_RESTART を指定してシグナル ハンドラーを登録する必要があります。
低レベルの入出力エラーで、通常はデバイスの読み書き時に発生します。ディスクの場合は不良セクターやケーブルの不良を示すことが多いため、dmesg と SMART の状態を確認してください。すでに閉じた端末に書き込んだときにも発生します。
デバイスまたはアドレスが存在しません。デバイス ファイルはあるものの背後にハードウェアがないか、読み手のいない FIFO を O_NONBLOCK で書き込み用に開きました。
exec に渡す引数と環境変数のリストが大きすぎます。数千のファイルに展開されるワイルドカードを使ったときの定番の「Argument list too long」です。find -exec か xargs を使ってください。
ファイルが認識できる実行形式ではありません。別のアーキテクチャのバイナリ、破損したファイル、または #! 行のないスクリプトです。
ファイル記述子が無効か、すでに閉じられているか、その操作を許可しないモードで開かれています。たとえば、読み取り専用で開いた記述子に書き込んだ場合です。
wait や waitpid で待つ子プロセスがありません。SIGCHLD が無視され、子プロセスが自動的に回収されていることがよくあります。
リソースが一時的に利用できないため、再試行してください。非ブロッキング操作ではまだデータや空きがないことを、fork ではプロセスまたはスレッドの上限 (ulimit -u または cgroup の pids.max) に達したことを意味します。
同じ値:EWOULDBLOCK
操作に必要なメモリが足りないか、プロセスのメモリ上限を超えました。fork や mmap では、オーバーコミット ポリシー、cgroup の上限、アドレス空間の不足が原因の場合があります。
ファイルまたはパス上のディレクトリのアクセス許可 (各ディレクトリに実行許可が必要)、ACL、SELinux や AppArmor、noexec でのマウントによってアクセスが拒否されました。特権なしで 1024 未満のポートを使うと、bind もこのエラーを返します。
無効なメモリ アドレスを指すポインターがシステム コールに渡されました。プログラムのバグを示します。
操作にはディスクのようなブロック デバイスが必要ですが、別の種類のファイルが渡されました。たとえば、通常のファイルを -o loop なしでマウントした場合です。
デバイスまたはリソースが使用中です。開いているファイルや、その中を開いている端末があるファイル システムをアンマウントしようとしたときによく発生します。lsof や fuser で使用中のプロセスを確認できます。
その名前のファイル、ディレクトリ、その他のオブジェクトがすでに存在します。たとえば、O_EXCL で作成したとき、-p なしで mkdir を使ったとき、作成先がすでに存在するリンクを作成したときです。
異なるファイル システム間では、ハード リンクの作成もファイル名の変更もできません。mv はコピーと削除で対処します。rename() を使うプログラムも同じようにする必要があります。
デバイスが存在しないか、その操作をサポートしていません。たとえば、カーネル モジュールが読み込まれていない種類のファイル システムをマウントした場合です。
ディレクトリであるべきパスの構成要素がファイルであるか、ディレクトリを要求した (O_DIRECTORY) のにディレクトリではありません。
ディレクトリに対してファイルの操作を行おうとしました。たとえば、書き込み用に開こうとした場合です。
呼び出しに対して引数が無効です。範囲外の値、互換性のないオプションの組み合わせ、オブジェクトがサポートしない操作などです。汎用的なエラーなので、具体的なケースはその呼び出しの man ページに記載されています。
システム全体の、開いているファイルのテーブルを使い切りました。上限は sysctl の fs.file-max で調整します。
プロセスが開いている記述子の上限に達しました (「Too many open files」)。ulimit -n または systemd の LimitNOFILE で上限を引き上げ、プログラムがファイルやソケットを閉じ忘れていないか確認してください。
端末ではないものに対して端末の操作 (ioctl) が要求されました。たとえば、対話型プログラムの出力をファイルやパイプにリダイレクトした場合です。
実行ファイルが使用中です。実行中のバイナリには書き込めず、書き込み用に開かれたままのバイナリは実行できません。更新するときは、新しいファイルを書き込んでから名前を変更するのが安全です。
ファイルが、ファイル システムで扱える最大サイズ (FAT32 では 4 GB) またはプロセスの RLIMIT_FSIZE 上限を超えています。
デバイスに空き領域がありません。df で空きがあるのに発生する場合は、df -i で inode を確認してください。fs.inotify.max_user_watches を使い切ったときは inotify もこのエラーを返します。
パイプ、FIFO、ソケットには位置がないため、lseek できません。
ファイル システムが読み取り専用でマウントされています。誰も指定していないのに読み取り専用になった場合は、カーネルがエラーを検出したためです。dmesg を確認して fsck を実行してください。
ファイルへのハード リンクの最大数を超えました。一部のファイル システムでは、ディレクトリのサブディレクトリ数の上限を超えた場合にも発生します。
相手側がすでに閉じたパイプまたはソケットに書き込みました (「Broken pipe」)。エラーに加えて、プロセスは SIGPIPE を受け取ります。cmd | head のように読み手が先に終了する場合は正常な動作です。
数学関数の引数が定義域外です。たとえば、負の数の平方根です。
関数の結果が大きすぎるか小さすぎて表現できないか、バッファーが結果に対して足りません。たとえば、短いバッファーで getcwd を呼び出した場合です。
デッドロックが回避されました。要求したロック (fcntl によるファイル ロックや、エラー検出付きのミューテックスなど) は永久に待ち続けることになっていました。
同じ値:EDEADLOCK
パスまたはその構成要素が最大長を超えています。Linux では通常、名前ごとに 255 バイト、パス全体で 4096 バイトです。
利用できるロックがありません。NFS では、ロック サービス (lockd または rpc.statd) が動作していないことを示す場合がよくあります。
このカーネルにはそのシステム コールが存在しないか、実装されていません。新しいカーネル向けにコンパイルされたバイナリや、最近のシステム コールを知らないコンテナーの seccomp プロファイルでよく発生します。
ディレクトリが空ではありません。たとえば、rmdir を使ったときや、既存のディレクトリを上書きする形で名前を変更したときです。中身ごと削除するには rm -r を使ってください。
パスの解決中に連鎖するシンボリック リンクが多すぎました (通常はループが原因です)。または、シンボリック リンクに対して O_NOFOLLOW を使いました。
System V のメッセージ キューに、要求した種類のメッセージがありません。
プロセスが使用している間に、System V IPC の識別子 (キュー、セマフォ、共有メモリ) が削除されました。
チャネル番号が範囲外です。Linux では実用上使われない旧来のコードです。
レベル 2 が同期していません。Linux では実用上使われない、System V 由来の旧来のコードです。
レベル 3 が停止しました。Linux では実用上使われない、System V 由来の旧来のコードです。
レベル 3 がリセットされました。Linux では実用上使われない、System V 由来の旧来のコードです。
リンク番号が範囲外です。Linux では実用上使われない旧来のコードです。
プロトコル ドライバーが接続されていません。一部の Bluetooth ドライバーなど、限られたサブシステムが使用します。
利用できる CSI 構造体がありません。Linux では実用上使われない旧来のコードです。
レベル 2 が停止しました。Linux では実用上使われない、System V 由来の旧来のコードです。
無効な交換です。旧来のコードですが、一部のドライバーやファイル システムが独自の意味で再利用しています。
無効な要求記述子です。旧来のコードですが、一部のドライバーが独自の意味で再利用しています。
交換が満杯です。Linux では実用上使われない旧来のコードです。
「anode」がありません。Linux では実用上使われない旧来のコードです。
無効な要求コードです。旧来のコードで、一部のドライバーはサポートしないコマンドに対して使用します。
無効なスロットです。Linux では実用上使われない旧来のコードです。
フォント ファイルの形式が正しくありません。Linux では実用上使われない旧来のコードです。
デバイスが STREAM ではありません。Linux が実装していない System V の STREAMS インターフェイスのコードです。
利用できるデータがありません。Linux では、拡張属性が存在しないときに getxattr が返します。macOS ではこの場合 ENOATTR になります。
タイマーが期限切れになりました。STREAMS 由来で、Linux では一部のドライバーや io_uring がタイムアウト付きの操作に使用します。
STREAMS のリソースが残っていません。STREAMS は Linux が実装していないインターフェイスです。
マシンがネットワーク上にありません。あまり使われない旧来のコードです。
パッケージがインストールされていません。旧来のコードで、一部のサブシステムはモジュール (たとえば暗号モジュール) がないときに使用します。
オブジェクトはリモートにあります。NFS では、別のサーバーからエクスポートされているパスを示します。
リンクが切断されました。旧来のコードで、一部のドライバーはデバイスとの接続が失われたときに使用します。
「advertise」のエラーです。Linux では使われない、RFS 由来の旧来のコードです。
「srmount」のエラーです。Linux では使われない、RFS 由来の旧来のコードです。
送信時の通信エラーです。旧来のコードで、一部のネットワーク ドライバーや USB ドライバーが使用します。
プロトコル エラーです。相手側またはデバイスが予期しない応答を返しました。USB デバイスや、やり取りの途中で切断された接続で発生します。
マルチホップ (multihop) が試行されました。RFS 由来の旧来のコードです。
RFS 固有のエラーです。Linux では使われません。
メッセージの形式が不正か、破損しています。ext4、XFS、Btrfs は、メタデータのチェックサム検証に失敗したときに、EFSBADCRC という別名でこれを返します。
同じ値:EFSBADCRC
値が格納先のデータ型に収まりません。たとえば、ラージ ファイル サポートなしでコンパイルされた 32 ビット プログラムが 2 GB を超えるファイルを開いた場合です。
名前がネットワーク上で一意ではありません。旧来のコードです。
ファイル記述子の状態が正しくありません。ALSA や一部のドライバーが、デバイスの準備ができていないときに使用します。
リモート アドレスが変わりました。旧来のコードです。
必要な共有ライブラリにアクセスできません。a.out バイナリ由来の旧来のコードです。
共有ライブラリが破損しています。a.out バイナリ由来の旧来のコードです。
a.out バイナリの .lib セクションが破損しています。旧来のコードです。
リンクしようとした共有ライブラリが多すぎます。a.out 由来の旧来のコードです。
共有ライブラリは直接実行できません。a.out 由来の旧来のコードです。
バイト シーケンスが文字エンコードとして無効です。たとえば、iconv やマルチバイト関数で変換するテキストが有効な UTF-8 ではない場合です。
中断された呼び出しを再開する必要があります。カーネル内部で使われるもので、プログラムに届くことはないはずです。
STREAMS のパイプ エラーです。ALSA は、オーディオ デバイスがサスペンドされているときにこれを返します。
ユーザーが多すぎます。ディスク クォータ システムがテーブルを使い切ったときに返しますが、まれです。
ソケットではない記述子に対してソケットの操作を使用しました。
宛先アドレスが必要です。コネクションレスのソケットで、宛先を指定せずに送信しました。
メッセージがソケットに対して大きすぎます。たとえば、最大サイズを超える UDP データグラムや、断片化が許可されていないときに MTU を超えるデータグラムです。
プロトコルがソケットの種類に対応していません。
要求したソケット オプションまたはプロトコルは利用できません。たとえば、カーネルが認識しない setsockopt のオプションです。
プロトコルがサポートされていません。たとえば、そのカーネル モジュールが読み込まれていない場合です。
そのアドレス ファミリでは、このソケットの種類はサポートされていません。
その操作はソケットまたはオブジェクトでサポートされていません。Linux では ENOTSUP と同じ値で、多くのファイル システムは fallocate や拡張属性など、実装していない機能に対してこれを返します。
その操作はサポートされていません。Linux では EOPNOTSUPP と同じ値 (95) ですが、macOS では別のコードです。
プロトコル ファミリがサポートされていません。
アドレス ファミリがサポートされていません。IPv6 が無効になっているシステムやコンテナーで IPv6 を使うとよく発生します。
アドレスとポートはすでに使用中です。別のプロセスがそのポートで待ち受けているか、以前の接続がまだ TIME_WAIT にあります。ss -ltnp または lsof -i :ポート でプロセスを探すか、SO_REUSEADDR を使ってください。
要求したアドレスを割り当てられません。その IP がマシンのどのインターフェイスにも属していないか、送信接続用のエフェメラル ポートを使い切りました。
ネットワーク インターフェイスがダウンしています。
宛先ネットワークへのルートがないため、到達できません。ルーティング テーブルとゲートウェイを確認してください。IPv6 の接続性がない状態で IPv6 で接続したときにも発生します。
ネットワークによって接続がリセットされました。たとえば、keepalive が失敗した場合です。
接続がローカル側で中止されました。たとえば、サーバーが accept で受け付ける前にクライアントが接続を閉じた場合です。
相手側が RST で接続を突然切断しました (「Connection reset by peer」)。リモートのプロセスが終了した、ファイアウォールやロード バランサーがアイドル状態の接続を切断した、または相手が想定していないデータを送信した、などが原因です。
ネットワーク操作に使えるバッファー領域がカーネルにありません。トラフィックが多いときや、ソケットのキューが満杯のときによく発生します。
ソケットはすでに接続されています。
ソケットが接続されていません。接続前に送受信しようとしたか、接続がすでに閉じられています。FUSE マウントでは、そのプロセスが終了すると「Transport endpoint is not connected」と表示されます。fusermount -u でアンマウントすれば解決します。
shutdown でソケットのその方向を閉じた後は送信できません。
参照が多すぎます。Linux では、Unix ソケットで入れ子になった記述子を渡しすぎた場合です。
宛先が応答しなかったため、接続がタイムアウトしました。パケットを黙って破棄するファイアウォール、電源の切れたホスト、到達しないルートが主な原因です。
宛先が接続を拒否しました。マシンは応答していますが、そのポートで待ち受けているものがないか、ファイアウォールが拒否を返しています。サービスが起動していて、127.0.0.1 だけでなく正しいインターフェイスで待ち受けているか確認してください。
宛先ホストがダウンしています。
ホストへのルートがありません。ローカル ネットワークで ARP に応答しないか、ルーターやファイアウォールが到達不能と通知しています。
ソケットではすでに操作が進行中です。たとえば、まだ完了していない非ブロッキングの connect です。
操作は進行中です。非ブロッキングの connect が開始され、後で完了します。エラーではないため、poll または select で待つ必要があります。
ファイル ハンドルが古くなっています。NFS で、ファイルまたはディレクトリがサーバー上で削除または置き換えられた場合です。パスを開き直すか、再マウントすれば解決します。
構造のクリーンアップが必要です。ファイル システムが破損を検出しました (ext4 と XFS では EFSCORRUPTED という別名)。アンマウントして fsck または xfs_repair を実行してください。
同じ値:EFSCORRUPTED
XENIX の名前付きファイルではありません。使われていない旧来のコードです。
利用できる XENIX セマフォがありません。使われていない旧来のコードです。
XENIX の名前付きファイルです。使われていない旧来のコードです。
リモート I/O エラーです。たとえば、I2C デバイスやリモート ディスクが応答しなかった場合です。
ユーザーまたはグループのディスク クォータを超えました。
デバイスにメディアがありません。たとえば、ディスクの入っていないドライブや空のカード リーダーです。
メディアの種類が正しくありません。
操作がキャンセルされました。たとえば、非同期 I/O や io_uring の待機です。
必要なキーがカーネルのキーリングにありません。fscrypt や eCryptfs などの暗号化ファイル システムで、キーが読み込まれていない場合に発生します。
キーの有効期限が切れました。PAM と Kerberos も、パスワードやチケットの期限が切れたときにこれを使用します。
キーが取り消されました。
サービスがキーを拒否しました。
ロバスト ミューテックスの所有者が解放せずに終了しました。新しい所有者は保護対象の状態を整合させてから、pthread_mutex_consistent を呼び出す必要があります。
前の所有者が終了し、誰も整合済みとしてマークしなかったため、ロバスト ミューテックスで保護された状態を回復できません。
Wi-Fi または Bluetooth の無線が RF-kill でブロックされているため、操作できません。rfkill list、物理スイッチ、機内モードのキーを確認してください。
メモリ ページにハードウェア エラーがあり、カーネルがポイズン済みとしてマークしました。
ファイルの種類がその操作に適していません。macOS と BSD では以前からありますが、Linux には最近追加されました。
プロセスが多すぎます。BSD ではプロセス数の上限用に定義されていますが、実際には fork は EAGAIN を返します。
RPC 構造体が正しくありません (NFS が使う Sun RPC)。
RPC のバージョンが一致しません (NFS が使う Sun RPC)。
サーバーで RPC プログラムを利用できません。
RPC プログラムのバージョンが一致しません。
RPC プログラムにそのプロシージャが存在しません。
認証エラーです。たとえば、NFS リソースをマウントしたときに発生します。
操作には認証子が必要です。
デバイスの電源が切れています。
デバイス エラーです。たとえば、用紙切れのプリンターです。
実行ファイルが無効です。
実行ファイルが別の種類の CPU 用です。たとえば、Rosetta 2 のない Apple Silicon 搭載 Mac 上の x86_64 専用バイナリや、Intel 搭載 Mac 上の ARM バイナリです。
共有ライブラリのバージョンが一致しません。
Mach-O ファイルの形式が不正か、破損しています。
拡張属性が存在しません。Linux の ENODATA に相当します。xattr で発生し、たとえば com.apple.quarantine を持たないファイルからそれを削除しようとした場合です。
MAC Framework に、その名前で登録されたポリシーはありません。
ネットワーク インターフェイスの送信キューが満杯です。
ケーパビリティが不足しています。サンドボックスで制限された呼び出しが返します。
プロセスを制御していた端末が閉じられたか、SSH セッションが切断されました。nginx、sshd、rsyslog など多くのデーモンは、これを設定の再読み込み要求として使います。nohup、tmux、screen を使うと、ログアウト時にプロセスが終了するのを防げます。
キーボードから Ctrl+C で割り込みます。プログラムはこれを捕捉して、正常に終了処理を行えます。終了コードは 130 です。
キーボードから Ctrl+\ で終了します。コア ダンプを出力してプロセスを終了しますが、JVM はスレッドの状態を出力するために使います。
プロセッサーが不正な命令を検出しました。新しい CPU 向けにコンパイルされたバイナリ (たとえば、AVX2 や AVX-512 を持たないプロセッサーでそれらを使うもの)、破損したコード、データへのジャンプが原因です。
デバッグ トラップです。デバッガーがブレークポイントに使います。デバッガーなしで届いた場合は、macOS の Swift のチェックのように、プログラム自身が検出した障害であることがよくあります。
プロセスが abort() を呼び出しました。失敗したアサーション、捕捉されなかった C++ の例外、C ライブラリが検出したヒープの破損 (「double free or corruption」) が原因です。終了コードは 134 です。
同じ値:SIGIOT
バス エラーです。一部のアーキテクチャでのアラインされていないメモリへのアクセスや、ファイルが切り詰められたために存在しなくなった、mmap でマップしたファイルの部分へのアクセスです。/dev/shm がいっぱいになったときにも発生します。
算術例外です。名前に反して、最も多い原因は整数のゼロ除算です。
プロセスを直ちに終了します。捕捉、ブロック、無視はできません。kill -9、メモリが枯渇したときのカーネルの OOM killer、そしてコンテナーがメモリ上限を超えた (OOMKilled) か SIGTERM の後に時間内に終了しなかったときの Docker や Kubernetes が送信します。終了コードは 137 です。
各アプリケーションが独自の用途に使える空きシグナルです。たとえば、dd は進行状況を報告し、nginx はログを開き直します。
セグメンテーション違反 (「Segmentation fault」) です。NULL ポインターの逆参照、配列の範囲外へのアクセス、無限再帰によるスタック オーバーフローなど、無効なメモリへのアクセスです。終了コードは 139 です。
各アプリケーションが独自の用途に使える 2 つ目の空きシグナルです。
読み手のいないパイプまたはソケットへの書き込みです。読み手が先に終了する cmd | head では正常な動作です。サーバーは通常これを無視して、EPIPE エラーを処理します。終了コードは 141 です。
alarm または setitimer で設定したタイマーが期限切れになりました。
正常な終了の要求です。kill、systemctl stop、docker stop のデフォルトのシグナルで、Kubernetes も Pod を削除するときに送信します。プロセスは接続を閉じて終了する必要があります。終了コードは 143 です。
コプロセッサーのスタック フォールトです。現在の Linux では使われていません。
子プロセスが終了、停止、または再開しました。親は wait で回収する必要があり、回収しないと子はゾンビになります。
同じ値:SIGCLD
停止したプロセスを再開します。シェルの fg や bg が行う処理です。
プロセスを停止します。捕捉も無視もできません。SIGCONT で再開します。
端末から Ctrl+Z で停止します。SIGSTOP と異なり、プログラムはこれを捕捉できます。
バックグラウンドのプロセスが端末から読み取ろうとしました。
バックグラウンドのプロセスが、stty tostop が有効な状態で端末に書き込もうとしたか、端末の設定を変更しようとしました。
ソケットに緊急 (帯域外) データが届きました。Go は goroutine を中断するために内部で使います。
プロセスの CPU 時間の上限 (ulimit -t) を超えました。
プロセスに許可された最大ファイル サイズ (ulimit -f) を超えました。
プロセスの CPU 時間だけを数える仮想タイマーが期限切れになりました。
プロファイラーが使うプロファイリング タイマーが期限切れになりました。
端末ウィンドウのサイズが変わりました。全画面のプログラムは、これを使って再描画します。
O_ASYNC を設定した記述子で I/O が可能になりました。Linux では、SIGPOLL も同じシグナルです。
同じ値:SIGPOLL
電源障害です。UPS ソフトウェアが init システムに通知します。
不正なシステム コールです。現在よくある原因は、コンテナーのようにそれをブロックする seccomp フィルターです。
エミュレーション トラップ (EMT) です。macOS と BSD にはありますが、x86 や ARM 上の Linux にはありません。
macOS と BSD の端末で Ctrl+T によって送られる情報の要求です。多くのコマンドは進行状況を表示して応答します。
コマンドは正常に終了しました。成功を意味する唯一のコードで、それ以外の値はすべてエラーを示します。
一般的なエラーです。意味は各プログラムが決めます。詳細は通常、コマンドが stderr に出力した内容にあります。grep と diff は別の意味で使い、それぞれ「一致するものがなかった」「ファイルが異なる」を表します。
シェルの組み込みコマンドの誤用、またはスクリプトの構文エラーです。多くのプログラムは無効なオプションにも使い、grep は実際のエラーに使います。
コマンドの使い方が間違っています。引数が足りないか多すぎるか、オプションが正しくありません。
入力データの形式が正しくありません。
入力ファイルが存在しないか、読み取れません。
指定したユーザーが存在しません。主にメール プログラムが使います。
ホスト名が存在しません。
必要なサービスが利用できないか、ほかのカテゴリに当てはまらない失敗が発生しました。
プログラムの内部エラーです。
オペレーティング システムのエラーです。たとえば、fork やパイプの作成ができない場合です。
/etc/passwd などのシステム ファイルがないか、エラーがあります。
出力ファイルを作成できません。
ファイルの読み書き時の入出力エラーです。
一時的な失敗です。後で再試行してください。メール サーバーは、メッセージをキューに残すためにこれを使います。
リモート システムがプロトコルに従わない応答を返しました。
操作に必要なアクセス許可が不足しています。
構成にエラーがあります。
指定した時間を超えたため、timeout コマンドが終了させました。
コンテナーを実行する前に docker run 自体が失敗しました。たとえば、オプションの誤りやデーモンのエラーです。GNU timeout も、失敗したのが timeout 自身の場合にこれを返します。
ファイルは存在しますが、実行できません。実行許可がない、ディレクトリである、または別のアーキテクチャのバイナリです。Docker では、コンテナーのコマンドが実行可能ではありません。
コマンドが見つかりません。インストールされていない、PATH にない、または名前のつづりが間違っています。スクリプトでは #! 行のインタープリターがない場合にも発生し、Docker ではコンテナーのコマンドがイメージ内に存在しない場合に発生します。
128 を超えるコードはシグナルによってプロセスが終了したことを示しますが、128 はどのシグナルにも対応しません。Git はすべての致命的なエラー (「fatal: …」) に使います。たとえば、存在しないリポジトリや、クローン時の認証の失敗です。
終了コードが範囲外でした。8 ビットしか保持されないため、exit -1 は 255 になります。ssh も、リモート コマンドのコードと区別するため、接続や認証に失敗したときにこれを返します。
Linux の値は x86、x86-64、ARM のものです。Alpha、MIPS、SPARC、PA-RISC では一部の errno とシグナルの番号が異なります。英語のメッセージは glibc の strerror と strsignal が表示するもので、macOS で異なる場合はそちらも示します。128 を超える終了コードは 128 にシグナル番号を足したものとして解釈します。これは bash、Docker、Kubernetes の規則です。
仕組み
Linux でシステム コールが失敗すると、-1 を返し、その理由を示す番号を変数 errno に設定します。2 は ENOENT (ファイルが存在しない)、13 は EACCES (アクセス拒否) です。strerror はその番号を「No such file or directory」のような、画面に表示されるテキストに変換します。Python では [Errno 13]、Node.js では code: 'ECONNREFUSED' と表示され、Go、Rust、Java では同じテキストが表示されます。1 から 34 までの番号は元の Unix に由来し、すべてのシステムで同じです。それ以降は各システムが独自に番号を付けたため、ECONNREFUSED は Linux では 111、macOS では 61 です。名前には移植性がありますが、番号にはありません。
シグナルは、カーネルや別のプロセスがプロセスに送る通知です。Ctrl+C を押したときの SIGINT、終了を求める SIGTERM、問答無用で終了させる SIGKILL、無効なメモリにアクセスしたときの SIGSEGV などがあります。それぞれにデフォルトの動作があり、ほとんどは捕捉して別の処理を行えます。シグナルによってプロセスが終了すると、シェルは終了コードとして 128 にシグナル番号を足した値を報告します。137 は SIGKILL (9)、139 は SIGSEGV (11)、143 は SIGTERM (15) です。Docker と Kubernetes も同じ規則を使います。
終了コードは、プログラムが終了時に残す番号です。0 は成功、それ以外の値はエラーを意味します。8 ビットしか保持されないため、範囲は 0 から 255 です。規則はわずかしかありません。126 と 127 はコマンドを実行できない場合と見つからない場合にシェルが使い、64 から 78 は BSD の sysexits.h で定義されています。残りは各プログラムが決めます。たとえば grep は、何も見つからなかったときに 1 を返します。
例
Last State: Terminated · Reason: OOMKilled · Exit Code: 137137 = 128 + 9 · SIGKILLコンテナーがメモリ上限を超え、カーネルが SIGKILL で強制終了しました。resources.limits.memory で上限を引き上げるか、プロセスがなぜそれほどメモリを消費するのかを調べる必要があります。再起動しても解決しません。Error: connect ECONNREFUSED 127.0.0.1:5432ECONNREFUSED · Linux 111 · macOS 61 · Connection refusedポート 5432 で待ち受けているものがないため、Node.js は PostgreSQL に接続できませんでした。アプリケーションがコンテナーで動いている場合、127.0.0.1 はホストではなくそのコンテナー自身です。データベースのサービス名を使う必要があります。OSError: [Errno 48] Address already in useEADDRINUSE · Linux 98 · macOS 4848 という番号から、プログラムが macOS で動いていることがわかります。Linux では同じエラーが 98 です。どちらの場合も、別のプロセスがすでにそのポートを使っています。lsof -i :ポート でどのプロセスかを確認できます。ユースケース
- 番号や errno の名前しか表示しない、Python、Node.js、Go、C のアプリケーションのエラーを理解する。
- 終了コードから、Docker コンテナーが停止した理由や Kubernetes の Pod が再起動する理由を突き止める。
- macOS の errno 番号を正しい名前に変換する。35 以降は Linux と一致しません。
- 失敗したスクリプト、cron、CI ジョブの終了コードを解釈する。
- kill で送るシグナルを選び、プロセスが捕捉しなかった場合に何が起こるかを知る。
- 番号ではなく名前で比較する、移植性のあるエラー処理を書く。
よくある質問
exit code 137 はどういう意味ですか?
プロセスがシグナル 9、SIGKILL によって終了したことを意味します (128 + 9)。最も多い原因はメモリです。コンテナーが上限を超えた場合 (Kubernetes は OOMKilled と報告します) や、カーネルの OOM killer がそのプロセスを選んだ場合で、後者は dmesg に「Out of memory: Killed process」と記録されます。docker kill を使った場合や、SIGTERM の後に猶予時間内にプロセスが終了しなかった場合 (docker stop では 10 秒、Kubernetes では 30 秒) にも発生します。
SIGTERM と SIGKILL の違いは何ですか?
SIGTERM はプロセスに終了を求めるもので、プロセスはこれを捕捉して接続を閉じ、データを保存してから終了できます。SIGKILL はカーネルがその場でプロセスを終了させるもので、プロセスは何もできません。正しい手順は、SIGTERM を送って数秒待ち、まだ動いている場合にだけ SIGKILL を使うことです。systemd、docker stop、Kubernetes もそのようにしています。
同じ errno が macOS では別の番号になるのはなぜですか?
POSIX は名前を定義していますが、番号は定義していないためです。1 から 34 まではすべてのシステムが元の Unix の番号を受け継ぎましたが、それ以降は macOS の元になった BSD と、Linux が従った System V が別々に番号を付けました。そのため、番号ではなく、Python の errno.ECONNREFUSED、Node.js の err.code、C の定数など、常に名前で比較するのが安全です。
EACCES と EPERM の違いは何ですか?
EACCES (「Permission denied」) は、ファイルやパス上のディレクトリのアクセス許可が認めていないか、ACL や SELinux が妨げていることを意味します。chmod、chown、または該当するポリシーで解決します。EPERM (「Operation not permitted」) は、アクセス許可に関係なく、操作自体に特権が必要であることを意味します。たとえば、ファイルの所有者の変更や、別のユーザーのプロセスの強制終了です。root、capability、または変更不可などの属性の削除が必要です。
コマンドやコンテナーの終了コードはどうやって確認しますか?
bash と zsh では echo $? で直前のコマンドの終了コードを表示できます。PowerShell では $LASTEXITCODE です。Docker では、docker ps -a の STATUS 列に「Exited (137)」のように表示されます。Kubernetes では、kubectl describe pod の「Last State: Terminated」に、OOMKilled や Error などの理由とともに表示されます。