Почему неудачный кот возвращает 1, а другой - 2?

Таймеры взяты из пакета apt, поэтому они установлены по умолчанию. При установке по умолчанию они обеспечивают только ежедневное обновление индексов; это давно -установившееся поведение, которое также поддерживается заданием cron для систем без systemd.

Обновление пакета и последующие перезапуски происходят только в том случае, еслиunattended-upgradesустановлен и соответствует конфигурации этого пакета.

Подробности см. в соответствующем разделе Справочника Debian .

12
31.05.2020, 13:58
1 ответ

Статус выхода программы должен подчиняться нескольким правилам, кроме этих правил, существуют общие соглашения. Ни одно из этих соглашений не связано с ошибкой низкого уровня -, вызвавшей выход из программы. Можно написать программу, которая завершается с определенным кодом ошибки, которую она решила завершить, потому что файл не существует,и другой код ошибки, если он решил выйти из-за того, что ему было отказано в доступе к файлу, и другой код ошибки, если компонент каталога пути оказался каталогом, отличным от -, и т. д., но это было бы быть крайне необычным и сложным в аранжировке.

Статус выхода программы представляет собой целочисленное значение. В системах POSIX это значение имеет тип int, который обычно находится в диапазоне от -2 31 до 2 31 +1. Однако большая часть этого диапазона непригодна на практике по нескольким причинам. Прежде всего, по историческим причинам, большинство интерфейсов, которые позволяют программе наблюдать за статусом выхода своих дочерних элементов, возвращают только младшие 8 бит статуса выхода, что является значением от 0 до 255. Сюда входят системные функцииwaitиwaitpid¹, а также статус выхода в оболочке ². Таким образом, практически во всех смыслах и целях статус выхода представляет собой 8-битное -значение.

Значение 0 считается успешным, а любое другое значение считается неудачным. Так обстоит дело в оболочке, где булевы операторы ,ifи whileконструкции и все остальное, что включает в себя понятие true/false, считает, что статус выхода 0 является истинным, и любой другой статус, чтобы быть ложным. Это также относится к make, где ненулевой статус выхода приводит к остановке сборки с сообщением об ошибке и статусом ошибки. Вы можете спорить, является ли это соглашением (, поскольку технически автор программы может вернуть любой статус, который он хочет, а «успех» и «неудача» формально не определены в любом случае ), но на практике программа, которая завершает работу, со статусом 0 считается успешным, а программа, завершившаяся с другим статусом (1–255 ), считается неудачной.

Еще одна особенность оболочки, ограничивающая диапазон, заключается в том, что статус выхода в оболочке (, наблюдаемый через $?), кодирует другую информацию:

  • 126 указывает, что имя команды является существующим файлом, который не является исполняемым.
  • 127 указывает, что имя команды не может быть найдено.
  • 128+ N традиционно (и до сих пор в большинстве оболочек )указывает, что команда завершилась сигналом N . Некоторые снаряды используют другой диапазон, всегда выше 128.

Таким образом, на практике программы не могут с пользой использовать статус выхода за пределами 125. Это оставляет значения 1–125 для выражения различных ошибок.

Существует несколько широко распространенное, но далеко не универсальное соглашение о том, что большие значения рассматриваются как «более серьезные» отказы. В частности, для команд поиска, таких как grep, 1 означает «не найдено», а 2 или более указывают на некоторую ошибку, которая помешала поиску (, например. файл не найден, в отличие от найденного файла, но не содержащего строки поиска ). Точно так же команды сравнения, такие какcmpи diff, завершаются со статусом 0, что означает «идентичные файлы», 1 означает «различные файлы» и 2 или более означает, что «сравнение не может быть завершено из-за ошибки»..

Несколько программ определяют разные коды ошибок для разных ошибок, например sendmail и некоторые другие программы, связанные с почтой -(значения, определенные в sysexits.h), rsync , curl , wget .

На сегодняшний день наиболее распространенным соглашением для кодов ошибок является 0 для успеха, 1 для отказа. Языки программирования C и C++ определяютEXIT_FAILUREкак код состояния выхода, который используется для сообщения об ошибке, если нет особой причины для выбора определенного значения, а EXIT_FAILUREравно 1 в большинстве систем.

Такие ошибки, как «Нет такого файла или каталога», «Отказано в доступе»,«Не каталог» и т. д. имеют числовую кодировку под капотом :, этоerrnoзначения, возвращаемые системными функциями, чтобы указать, что пошло не так. Значения Errno обычно не используются в качестве статуса выхода из программ. Они кодируют детали того, что пошло не так, а не то, что это означает для конкретной программы. Например, статус выхода wget различает «ошибка синтаксического анализа в параметрах» (, обычно нет базовой системной ошибки ), «локальная ошибка ввода/вывода» (, независимо от основной системной ошибки ). ], «сетевой сбой» (, который в значительной степени будет использовать те же системные ошибки, что и локальный ввод-вывод )и т. д. Знание того, произошел ли сбой wget из-за сетевой ошибки или из-за ошибки локального файла, полезнее, чем знание того, не удалось из-за сломанного канала (записи в канал или закрытого соединения в сетевом сокете? )или к ошибке разрешения (невозможно прочитать файл конфигурации, или доступ к сети запрещен локальной политикой? ).

Довольно редко статусы возврата следуют за значениями errno. Это действительно происходит, особенно со сценариями Perl, из-за того, как работает функция Perl die. Но это плохая идея не только потому, что, как я упоминал выше, значение errno редко бывает самой полезной частью информации, но главным образом потому, что нет никаких причин, по которым значения errno должны находиться в диапазоне от 1 до 125. К счастью, я не знаю ни одной системы, в которой значения errno выходят за пределы диапазона 1–255, поэтому по крайней мереexit(errno)(или Perldie)не завершатся со значением, кратным 256, что, как мы видели выше. будет означать успех. Но в Linux , например, они достигают 126, и программа, завершившаяся с exit(errno)сerrno == ERFKILL(«Операция невозможна из-за RF -kill» ), будет неотличима от оболочка из программы, которая умерла из-за недопустимой инструкции SIGILL ().

¹waitidпредоставляет доступ к полному значению intчерез infop->si_status.
² Через $?или другим способом. Например, если exit256— это программа, которая завершается с exit(256), команда оболочки if exit256; then echo "exited with 0"; fiпечатает «выход с 0».

9
18.03.2021, 23:31

Теги

Похожие вопросы