Процесс считается завершенным правильно в Linux, если его состояние выхода было 0.
Я видел, что ошибки сегментации часто приводят к состоянию выхода 11, хотя я не знаю, является ли это просто соглашением, в котором я работаю (приложения, которые потерпели неудачу, как все, были внутренними) или стандартом.
Существуют ли стандартные коды выхода для процессов в Linux?
linux
error-handling
exit-code
Натан Феллман
источник
источник
Ответы:
8 битов кода возврата и 8 битов номера сигнала убийства смешиваются в одно значение при возврате из
wait(2)
& co. ,Как вы определяете статус выхода? Традиционно оболочка хранит только 8-битный код возврата, но устанавливает старший бит, если процесс был ненормально завершен.
Если вы видите что-то кроме этого, то, вероятно, программа имеет
SIGSEGV
обработчик сигнала, который затем вызываетсяexit
нормально, так что сигнал фактически не убивает. (Программы могут выбрать обработку любых сигналов, кромеSIGKILL
иSIGSTOP
.)источник
Часть 1: Расширенное руководство по написанию сценариев Bash
Как всегда, в Advanced Bash Scripting Guide есть много полезной информации : (Это было связано с другим ответом, но с неканоническим URL).
Часть 2: sysexits.h
Ссылки ABSG
sysexits.h
.В Linux:
источник
man sysexits
sysexits.h
? Человек страница все держит реферирование только прозу. Например, он ссылается,EX_OK
но на самом деле не определяет его нормативным образом, как другие коды. Есть еще что-то, чего не хватает?'1' >>> Catchall для общих ошибок
'2' >>> Неправильное использование встроенных командных оболочек (согласно документации Bash)
'126' >>> Вызванная команда не может быть выполнена
'127' >>> "Команда не найдена"
«128» >>> Недопустимый аргумент для выхода
'128 + n' >>> Сигнал фатальной ошибки "n"
'130' >>> Сценарий прекращен с помощью Control-C
'255' >>> Выход из состояния вне диапазона
Это для Баш. Однако для других приложений существуют разные коды выхода.
источник
Ни один из старых ответов не описывает правильное состояние выхода 2. Вопреки тому, что они утверждают, статус 2 - это то, что утилиты командной строки фактически возвращают при неправильном вызове. (Да, ответ может быть девять лет, иметь сотни голосов, и все же быть неправильным.)
Вот реальное, давнее соглашение о статусе выхода для нормального завершения, то есть не по сигналу:
Например,
diff
возвращает 0, если сравниваемые файлы идентичны, и 1, если они различаются. В соответствии с давним соглашением, программы Unix возвращают состояние выхода 2 при неправильном вызове (неизвестные параметры, неправильное количество аргументов и т. Д.). Напримерdiff -N
,grep -Y
илиdiff a b c
все они приведут$?
к установке на 2. Это и было практикой, так как Первые дни Unix в 1970-х.Общепринятый ответ объясняет , что происходит , когда команда прерывается сигналом. Вкратце, завершение из-за необработанного сигнала приводит к состоянию выхода
128+[<signal number>
. Например, завершениеSIGINT
( сигнал 2 ) приводит к состоянию выхода 130.Ноты
В нескольких ответах статус выхода 2 определяется как «Неправильное использование встроенных команд bash». Это применимо только тогда, когда bash (или скрипт bash) выходит со статусом 2. Считайте, что это особый случай неправильной ошибки использования.
В
sysexits.h
упомянутом в самом популярном ответе статус выходаEX_USAGE
(«ошибка использования командной строки») определен как 64. Но это не отражает реальность: я не знаю ни одной распространенной утилиты Unix, которая возвращает 64 при неправильном вызове (примеры приветствуются ). Внимательное прочтение исходного кода показывает, что этоsysexits.h
является желательным, а не отражением истинного использования:Другими словами, эти определения не отражают общепринятую практику того времени (1993 г.), но намеренно несовместимы с ней. Больше жалости.
источник
more
сбросит режимы терминала и выйдет со статусом 0 (можно попробовать).Стандартных кодов выхода нет, кроме 0, означающего успех. Ненулевое также не обязательно означает неудачу.
stdlib.h определяет
EXIT_FAILURE
как 1 иEXIT_SUCCESS
как 0, но это все.11 на segfault интересен, так как 11 - это номер сигнала, который ядро использует для уничтожения процесса в случае segfault. Вероятно, существует какой-то механизм, либо в ядре, либо в оболочке, который преобразует это в код выхода.
источник
sysexits.h имеет список стандартных кодов выхода. Похоже, он датируется как минимум 1993 годом, и некоторые крупные проекты, такие как Postfix, используют его, так что я думаю, что это путь.
Со страницы руководства OpenBSD:
источник
В первом приближении 0 - это успех, ненулевое значение - сбой, 1 - общий сбой, а все, что больше, - конкретный сбой. Помимо тривиальных исключений false и test, которые предназначены для получения 1 за успех, есть еще несколько исключений, которые я обнаружил.
Более реалистично, 0 означает успех или, возможно, сбой, 1 означает общий отказ или, может быть, успех, 2 означает общий отказ, если 1 и 0 оба используются для успеха, но, возможно, также и успех.
Команда diff дает 0, если сравниваемые файлы идентичны, 1, если они различаются, и 2, если двоичные файлы различны. 2 также означает неудачу. Команда less выдает 1 за неудачу, если только вы не предоставите аргумент, в этом случае она выходит из 0, несмотря на неудачу.
Команда more и команда spell дают 1 для сбоя, если сбой не является результатом отказа в доступе, несуществующего файла или попытки прочитать каталог. В любом из этих случаев они выходят из 0, несмотря на неудачу.
Затем команда expr выдает 1 для sucess, если только вывод не является пустой строкой или нулем, в этом случае 0 является sucess. 2 и 3 провал.
Тогда есть случаи, когда успех или неудача неоднозначны. Когда grep не удается найти шаблон, он выходит из 1, но выходит из 2 для подлинного сбоя (например, отказано в разрешении). Klist также выходит из 1, когда не удается найти заявку, хотя на самом деле это не больше сбой, чем в случае, когда grep не находит шаблон, или когда вы используете пустой каталог.
Так что, к сожалению, unix-возможности, похоже, не реализуют какой-либо логический набор правил, даже для очень часто используемых исполняемых файлов.
источник
Программы возвращают 16-битный код выхода. Если программа была прервана с помощью сигнала, то старший байт содержит используемый сигнал, в противном случае младший байт - это состояние выхода, возвращаемое программистом.
Как этот код выхода назначается переменной состояния $? затем до оболочки. Bash сохраняет младшие 7 бит состояния и затем использует 128 + (сигнал nr) для индикации сигнала.
Единственное «стандартное» соглашение для программ - 0 для успеха, ненулевое для ошибки. Другое используемое соглашение - возвращать errno в случае ошибки.
источник
Стандартные коды выхода Unix определяются sysexits.h, как упоминалось в другом постере. Такие же коды выхода используются переносимыми библиотеками, такими как Poco - вот их список:
http://pocoproject.org/docs/Poco.Util.Application.html#16218
Сигнал 11 является сигналом SIGSEGV (нарушение сегмента), который отличается от кода возврата. Этот сигнал генерируется ядром в ответ на неправильный доступ к странице, что приводит к завершению программы. Список сигналов можно найти на странице справки по сигналам (запустите «сигнал человека»).
источник
Когда Linux возвращает 0, это означает успех. Все остальное означает сбой, у каждой программы есть свои коды выхода, поэтому было бы довольно долго перечислять их все ...!
Что касается кода ошибки 11, это действительно номер ошибки сегментации, в основном это означает, что программа получила доступ к области памяти, которая не была назначена.
источник