Bash получить код завершения команды в Linux / Unix
Я новый пользователь системы Linux. Как мне получить код завершения команды?
Как получить код вывода или статус команды оболочки Linux или Unix и сохранить его в переменной оболочки?
Введение. Каждая команда оболочки Linux или Unix возвращает состояние, когда она завершается нормально или ненормально.
Например, если скрипт backup.sh не выполнен, и он возвращает код, который сообщает скрипту оболочки отправить электронное письмо админу.
Что такое код вывода в оболочке bash?
Каждая команда Linux или Unix, выполняемая скриптом оболочки или пользователем, имеет статус вывода.
Статус вывода – это целое число.
0 состояние выхода означает, что команда была успешной без каких-либо ошибок.
Ненулевое (1-255 значений) состояние выхода означает, что команда была неудачной.
Как узнать код вывода команды
Из приведенных выше выводов ясно, что код вывода 0 означает, что команда date была успешной.
Кроме того, код вывода – 127 (не ноль), так как команда nonexistant не была успешной.
Bash как получить код завершения команды – Как использовать коды вывода в скриптах оболочки
Итак, как вы сохранить статус вывода команды в переменной оболочки?
Как мне установить код вывода для моих собственных скриптов оболочки?
Команда exit вызывает обычное завершение скриптов оболочки.
Вывод из оболочки со статусом N. Синтаксис:
Пример скрипта оболочки для получения кода завершения команды
Заключение
На этой странице показано, как использовать коды вывода в системах на основе Linux или Unix и как получить статус вывода / код команды.
BASH exit code
Самое частое применение — скрипты, для которых нужно предусмотреть возможность прерывания извне. Например, закончившееся пространство на диске при размещении на нем резервной копии данных. Или автоматизированный перенос сайта с одного сервера на другой.
Большая часть программ возвращают 0 при успешном выполнении и коды отличные от нуля при возникновении ошибок.
Это 1 или другой код, для каждой утилиты коды ответа описаны в документации.
Вывести код выполнения последней команды можно так:
Для демонстрации будем использовать HTML файл со случайным текстом.
Проверим равняется ли возвращаемое значение единице
Т.е. паттерн не найдем в файле. bash exit code можно просто выводить в консоль
При обнаруженном совпадении:
looki-for
0
Если совпадения нет:
Если произошла ошибка — например, отсутствует файл в котором утилите grep дано указание искать
grep: site2.html: No such file or directory
2
Коды для каждой утилиты нужно искать в документации, awk, например, всегда будет возвращать 0
Exit code может принимать значения от 0 до 256.
Exit code при написании скриптов
При написании скриптов стоит учитывать, что в приведенном выше примере речь идет об одной команде. Если это несколько команд, выполняющиеся одна за другой ошибку можно пропустить проверяя exit code одной из них.
grep: site2.html: No such file or directory
2
hey
0
Поэтому лучше всего объединять последовательность команд в отдельный скрипт или функцию и проверять код выхода скрипта или функции.
some bash code
what to do if errors detected
За счет нее также можно предусмотреть действие выполняемое в случае если bash скрипт возвращает exit code, который говорит о неуспешном выполнении.
Таким действием обычно является запись информации в лог, отправка уведомления администратору или удаление временных фйлов.
Как использовать коды завершения в Bash-скриптах
Инструменты автоматизации и мониторинга удобны тем, что разработчик может взять готовые скрипты, при необходимости адаптировать и использовать в своём проекте. Можно заметить, что в некоторых скриптах используются коды завершения (exit codes), а в других нет. О коде завершения легко забыть, но это очень полезный инструмент. Особенно важно использовать его в скриптах командной строки.
Что такое коды завершения
В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0 при успешном исполнении и 1 или большее число при неудачном исполнении.
Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.
Кроме того, даже если вы не определяете коды завершения, они всё равно есть в ваших скриптах. Но без корректного определения кодов выхода можно столкнуться с проблемами: ложными сообщениями об успешном исполнении, которые могут повлиять на работу скрипта.
Что происходит, когда коды завершения не определены
В Linux любой код, запущенный в командной строке, имеет код завершения. Если код завершения не определён, Bash-скрипты используют код выхода последней запущенной команды. Чтобы лучше понять суть, обратите внимание на пример.
Как использовать коды завершения в Bash-скриптах
Проверяем коды завершения
После рефакторинга скрипта получаем такое поведение:
Создаём собственный код завершения
Как использовать коды завершения в командной строке
Скрипт уже умеет сообщать пользователям и программам об успешном или неуспешном выполнении. Теперь его можно использовать с другими инструментами администрирования или однострочниками командной строки.
Скрипт использует коды завершения, чтобы понять, была ли команда успешно выполнена. Если коды завершения используются некорректно, пользователь скрипта может получить неожиданные результаты при неудачном выполнении команды.
Дополнительные коды завершения
Адаптированный перевод статьи Understanding Exit Codes and how to use them in bash scripts by Benjamin Cane. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.
О завершении работы Node.js-процессов
Существует несколько способов намеренного завершения работы процесса. Среди них — следующие:
| Операция | Пример |
| Ручной выход из процесса | |
| Неперехваченная ошибка | |
| Необработанное отклонение промиса | |
| Проигнорированное событие error | |
| Необработанный сигнал |
Ручной выход из процесса
Этот Node.js-однострочник ничего в консоль не выведет. Правда, воспользовавшись возможностями командной оболочки, можно узнать статус завершения процесса. Пользователь программы, столкнувшись с тем, что она завершила работу подобным образом, не поймёт того, что произошло.
Теперь пользователю будут понятны причины остановки приложения. Пользователь запускает приложение, оно выдаёт ошибку в консоль, после чего пользователь принимает меры для исправления ситуации.
Стоит отметить, что метод process.exit() — это весьма мощный механизм. Хотя у него есть своё место в коде приложений, его категорически не рекомендуется использовать в библиотеках, рассчитанных на многократное использование. Если ошибка произошла в библиотеке, библиотека должна её выбросить. Это позволит приложению, использующему библиотеку, самостоятельно принять решение о том, как обрабатывать эту ошибку.
Исключения, отклонения промисов, выдача событий error
Экземпляры класса Error содержат метаданные, которые полезны в деле определения причины ошибки. Например — данные трассировки стека и строки с сообщениями об ошибке. Распространённой является практика построения на основе класса Error классов ошибок, рассчитанных на конкретное приложение. При этом одно лишь создание экземпляра класса Error не приводит к каким-то заметным последствиям. Экземпляр ошибки нужно не только создать, но и выбросить.
А вот пример того, что при выполнении подобного кода выводится в консоли:
Отклонённые промисы, в отличие от неперехваченных исключений, не приводят, в Node.js v14, к остановке процесса. В будущих версиях Node.js отклонённые промисы будут завершать работу процессов. Подобные события, как и в случае с событиями ошибок, можно перехватывать с помощью объекта process :
Сигналы
В разных операционных системах могут быть определены различные сигналы. Ниже приведён список сигналов, которые, по большей части, универсальны.
| Имя | Код | Подлежит ли сигнал обработке | Стандартная реакция Node.js | Цель сигнала |
| 1 | Да | Завершение работы | Закрытие терминала | |
| 2 | Да | Завершение работы | Сигнал прерывания (Ctrl+C) с терминала | |
| 3 | Да | Завершение работы | Сигнал Quit с терминала (Ctrl+D) | |
| 9 | Нет | Завершение работы | Безусловное завершение процесса | |
| 10 | Да | Запуск отладчика | Пользовательский сигнал №1 | |
| 12 | Да | Завершение работы | Пользовательский сигнал №2 | |
| 15 | Да | Завершение работы | Запрос на завершение работы процесса | |
| 19 | Нет | Завершение работы | Остановка выполнения процесса |
Если в программе может быть реализован механизм обработки соответствующего сигнала — в столбце таблицы «Подлежит ли сигнал обработке» стоит «Да». Два сигнала из таблицы с «Нет» в этой колонке обработке не подлежат. В столбце «Стандартная реакция Node.js» описана стандартная реакция Node.js-программы на получение соответствующего сигнала. В столбце «Цель сигнала» приведено описание стандартного общепринятого подхода к использованию сигналов.
Для обработки этих сигналов в Node.js-приложении можно воспользоваться уже знакомым нам механизмом объекта process по прослушиванию событий:
Возможно, вы уже догадались о том, что Node.js-программы могут отправлять сообщения другим программам. Выполните следующую команду, которая демонстрирует отправку сообщения от короткоживущего процесса работающему процессу:
В ответ на эту команду наш процесс покажет то же SIGHUP-сообщение, что показывал ранее. А если же работу этого процесса нужно завершить, ему надо отправить необрабатываемый сигнал SIGKILL :
После этого работа программы должна завершиться.
Process. Exit Code Свойство
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает значение, заданное связанным процессом при завершении.
Значение свойства
Код, который задал связанный процесс при завершении.
Исключения
Процесс не был завершен.
-или- Процесс Handle не является допустимым.
Вы пытаетесь получить доступ к свойству ExitCode процесса, запущенного на удаленном компьютере. Это свойство доступно только для процессов, запущенных на локальном компьютере.
Примеры
В следующем примере запускается экземпляр блокнота. Затем в примере извлекаются и отображаются различные свойства связанного процесса. В примере обнаруживается, когда процесс завершается, и отображается код завершения процесса.
Комментарии
Используйте ExitCode для получения состояния, возвращенного системным процессом при его завершении. Можно использовать код выхода, похожий на целочисленное значение, возвращаемое main() процедурой.
ExitCodeЗначение для процесса отражает конкретное соглашение, реализуемое разработчиком приложения для этого процесса. Если вы используете значение кода выхода для принятия решений в коде, убедитесь, что вы знаете соглашение о коде выхода, используемое процессом приложения.
Разработчики обычно указывают на Успешный выход с ExitCode нулевым значением и обозначают ошибки ненулевыми значениями, которые вызывающий метод может использовать для определения причины аварийного завершения процесса. Не обязательно следовать этим рекомендациям, но они являются соглашением.
Если вы попытаетесь получить ExitCode до завершения процесса, попытка выдаст исключение. Сначала изучите HasExited свойство, чтобы проверить, завершился ли связанный процесс.
Можно использовать CloseMainWindow метод или, Kill чтобы вызвать завершение связанного процесса.





