bitlvl
RU

Справочник кодов выхода

Введите код, чтобы найти его. Любое значение выше 128 означает, что процесс был убит сигналом: вычтите 128, чтобы получить номер сигнала. Таблица на английском языке.

 
КодИмяЗначение
0SuccessThe command completed without error.
1General errorCatch-all: the program chose to signal failure (grep: no match; many tools: any error).
2Misuse of shell builtin / usage errorBash: wrong arguments to a builtin. grep: an error occurred (not just no match). Many CLIs: bad usage.
64EX_USAGECommand line usage error (sysexits.h).
65EX_DATAERRInput data was incorrect.
66EX_NOINPUTInput file did not exist or was unreadable.
67EX_NOUSERUser does not exist.
68EX_NOHOSTHost does not exist.
69EX_UNAVAILABLEService unavailable.
70EX_SOFTWAREInternal software error.
71EX_OSERROS error (fork failed, etc.).
72EX_OSFILECritical OS file missing.
73EX_CANTCREATCannot create output file.
74EX_IOERRInput/output error.
75EX_TEMPFAILTemporary failure; retry later (mail systems).
76EX_PROTOCOLRemote error in protocol.
77EX_NOPERMPermission denied.
78EX_CONFIGConfiguration error.
100Debian apt / dpkg errorapt-get: a package operation failed. Also Python: nothing standard.
125Docker: daemon errordocker run itself failed (bad option, image not found). Also xargs: command killed by signal / other failures.
126Command cannot executeFound but not executable (permission denied, or a directory). Also Docker: contained command cannot be invoked.
127Command not foundThe shell could not find the program on PATH (typo, missing package, wrong shebang).
128Invalid exit argumentexit called with a value outside 0–255.
129Killed by SIGHUP (128+1)Terminal hung up or daemon reload signal.
130Killed by SIGINT (128+2)Ctrl-C.
131Killed by SIGQUIT (128+3)Ctrl-\ (core dump).
132Killed by SIGILL (128+4)Illegal instruction: corrupted binary or wrong CPU architecture.
133Killed by SIGTRAP (128+5)Debugger breakpoint.
134Killed by SIGABRT (128+6)abort(): assertion failure, glibc detected heap corruption, Go/Rust panic in some modes.
135Killed by SIGBUS (128+7)Bus error: misaligned access or a memory-mapped file that was truncated.
136Killed by SIGFPE (128+8)Arithmetic error, typically integer division by zero.
137Killed by SIGKILL (128+9)Forcibly killed: OOM killer (check dmesg), kill -9, Docker/Kubernetes memory limit, timeout -s KILL.
139Killed by SIGSEGV (128+11)Segmentation fault: invalid memory access.
141Killed by SIGPIPE (128+13)Wrote to a closed pipe, e.g. `cmd | head` after head exited.
143Killed by SIGTERM (128+15)Polite termination request: kill, systemctl stop, docker stop (after the grace period it becomes 137).
148Killed by SIGTSTP (128+20)Ctrl-Z (stopped, reported by some shells).
152Killed by SIGXCPU (128+24)CPU time limit exceeded (ulimit -t).
153Killed by SIGXFSZ (128+25)File size limit exceeded (ulimit -f).
255Exit status out of range / -1exit(-1) wraps to 255. ssh: connection or protocol error. rsync: unexplained error.

Результаты и сообщения этого инструмента выводятся на английском языке.

Как устроены коды выхода

Каждый процесс завершается с 8-битным статусом от 0 до 255. По соглашению 0 означает успех, а всё остальное — ошибку; shell показывает его как $?, и &&, ||, if и set -e ветвятся по нему. Значение числа помимо «ноль/не ноль» определяет сама программа, но есть несколько почти универсальных соглашений.

Собственные коды shell

  • 126: файл найден, но не может быть выполнен. Отсутствует бит выполнения, это каталог, бинарник для другой архитектуры или раздел, смонтированный с noexec.
  • 127: не найден. Опечатка, программа не установлена или PATH отличается между вашей оболочкой и окружением, в котором выполняется скрипт (cron, systemd, Docker). Также строка shebang, указывающая на отсутствующий интерпретатор, включая окончания строк \r\n, превращающие путь в /bin/bash\r.
  • 128 + n: процесс погиб от сигнала n. Shell не может вернуть сигнал напрямую, поэтому добавляет 128. 130 — это Ctrl-C (SIGINT 2), 137 — SIGKILL (9), 139 — SIGSEGV (11), 143 — SIGTERM (15). Справочник сигналов перечисляет их все.

137 в контейнерах

Код 137 из контейнера — почти всегда OOM killer ядра или среда выполнения контейнера, применяющая лимит памяти: процессу отправлен SIGKILL, который нельзя перехватить, поэтому приложение ничего не записало в лог. Проверьте docker inspect на OOMKilled: true, dmesg на «Out of memory» или события Kubernetes на OOMKilled. 143 — нормальный результат docker stop или завершения пода, когда процесс обработал SIGTERM; 137 после остановки означает, что он не завершился в отведённый период.

sysexits.h

BSD определила коды 64–78, чтобы почтовые и системные утилиты сообщали категории ошибок (EX_USAGE 64, EX_NOINPUT 66, EX_TEMPFAIL 75…). Postfix, sendmail и некоторые программы на Perl и Go всё ещё их используют; больше никто, поэтому относитесь к ним как к соглашению, а не правилу.

Вопросы

Что означает код выхода 1?

Общая ошибка: программа решила, что что-то пошло не так, и не имела более конкретного кода. Для grep он означает, что ни одна строка не совпала, что вовсе не ошибка. Читайте вывод программы в stderr, а не число.

Почему я получаю 127 в cron или systemd, но не в своей оболочке?

PATH отличается. Профиль вашей оболочки добавляет каталоги вроде /usr/local/bin или ~/.local/bin, которых cron и systemd не видят. Используйте абсолютные пути или задайте PATH в начале скрипта.

Какой максимальный код выхода?

255. exit 256 превращается в 0, exit 300 становится 44 (300 mod 256). Отрицательные значения тоже заворачиваются: exit(-1) — это 255.

Как получить код выхода конвейера?

По умолчанию $? — статус последней команды. set -o pipefail заставляет конвейер завершиться с ошибкой, если упал любой этап, а массив PIPESTATUS в bash хранит код каждого этапа.