Как использовать коды выхода Linux для устранения неполадок в вашей системе Linux

Вы можете быстрее устранять неполадки с помощью кодов выхода Linux

Коды выхода, также известные как коды возврата или статусы выхода, — это числовые сигналы, которые программа, команда или скрипт отправляют обратно операционной системе (или вызывающему процессу) по завершении выполнения. Вам не нужно копаться в потенциально длинных журналах, чтобы диагностировать сбой — код выхода часто дает быструю подсказку о природе проблемы.

Универсально принятая конвенция заключается в том, что когда программа выполняется успешно, она возвращает код выхода 0. Любое другое число, как правило, в стандартном диапазоне от 1 до 255, указывает на то, что что-то пошло не так.

Самый простой способ проверить код выхода последней выполненной команды в интерактивных оболочках Unix-подобных систем (таких как Bash или Zsh) — это проверить специальную переменную оболочки $?. Например, сначала выполните любую команду, а затем проверьте ее код выхода:

ls/nonexistent_directory  
echo$?

Показ кодов выхода последней выполненной команды

Команда echo $? отображает числовой код выхода, хранящийся в переменной $?. Если вы видите 0, это означает, что предыдущая команда завершилась успешно. Ненулевое значение, такое как 1, 2 или 127, указывает на ошибку, и конкретное число дает подсказку о типе проблемы — возможно, отсутствующий файл, несуществующий каталог или недостаточные права.

Отладка вашего скрипта с помощью кодов выхода

Коды выхода особенно полезны, когда вы пишете скрипты оболочки. Они помогают вашему скрипту определить, все ли прошло хорошо или плохо, позволяя ему решить, что делать дальше.

Вот простой пример, который копирует файл в папку резервного копирования и сообщает, была ли копия успешной:

#!/bin/bash  
# Попробуйте скопировать файл  
cp important_file.txt backup/  
  
# Проверьте, была ли копия успешной, используя код выхода ($? хранит код выхода последней команды)  
if[$?-eq0]; then  
echo"Резервное копирование успешно!"  
else  
echo"Резервное копирование не удалось с кодом выхода $?"  
exit1# Завершите скрипт с кодом ошибки, чтобы указать, что что-то пошло не так.  
fi

Когда команда cp выполняется, она возвращает код выхода. Код выхода 0 означает, что все прошло гладко. Если код не равен 0, что-то пошло не так — и скрипт выводит сообщение об ошибке и завершает работу с кодом 1.

Установка собственных кодов выхода

В дополнение к проверке кодов выхода от команд вы можете определить свои собственные коды выхода, чтобы указывать на различные типы ошибок. Эта практика делает ваши скрипты более информативными, позволяя любому, кто их использует, понять, какая именно проблема возникла.

Рассмотрим этот скрипт:

#!/bin/bash  
# Проверьте, что аргумент (имя файла) предоставлен.  
if[-z"$1"]; then  
echo"Использование: $0 "  
exit1# Код выхода 1 указывает на то, что аргумент не был предоставлен.  
fi  
  
# Проверьте, существует ли файл, предоставленный в качестве первого аргумента.  
if[!-f"$1"]; then  
echo"Ошибка: Файл не найден"  
exit2# Пользовательский код выхода 2 указывает на то, что файл не был найден.  
fi

Если кто-то запустит ваш скрипт, и он завершится с ошибкой, он может обратиться к коду выхода, чтобы определить точную ошибку. В этом примере код выхода 1 сигнализирует о том, что пользователь не предоставил обязательный аргумент, в то время как код выхода 2 явно указывает на то, что файл не был найден. Этот структурированный подход особенно полезен, когда ваш скрипт является частью более крупной системы или когда другой скрипт зависит от его вывода.

Список общих кодов выхода

Хотя разные программы могут определять свои собственные коды выхода, есть некоторые общие шаблоны, которые вы увидите во многих инструментах командной строки — особенно в системах Linux и Unix-подобных. Вот некоторые из наиболее часто встречающихся:

  • 0: Все хорошо! Программа выполнялась без каких-либо проблем.
  • 1: Что-то пошло не так, но ошибка не конкретна. Это как универсальный код выхода.
  • 2: Неправильное использование встроенных команд оболочки. Это может произойти, если вы используете команду неправильно, например, забыв обязательные параметры.
  • 126: Команда существует, но у вас нет разрешения на ее выполнение.
  • 127: Команда не найдена. Это означает, что команда не существует или не находится в пути системы. Дважды проверьте ваше написание.
  • 128: Неверный аргумент выхода. Вы использовали число, которое не имеет смысла как код выхода.
  • 130: Программа завершена с помощью Ctrl + C. Это происходит, когда вы вручную останавливаете программу.
  • 137: Условие нехватки памяти (OOM).
  • 255: Программа попыталась вернуть код выхода вне допустимого диапазона.

Некоторые конкретные программы имеют свои уникальные коды выхода. Например, grep возвращает 0, когда находит совпадения, 1, когда не находит совпадений, и 2, когда возникает ошибка. Кроме того, разработчики могут технически использовать почти любое число (обычно от 0 до 255 в Unix-подобных системах).

Цепочка команд на основе успеха или неудачи

Bash также предоставляет два удобных оператора && и ||, которые позволяют вам связывать команды в зависимости от того, успешна ли предыдущая команда или нет:

  • && (логический оператор И): выполняет следующую команду только в том случае, если предыдущая команда завершилась успешно (код выхода 0).
  • || (логический оператор ИЛИ): выполняет следующую команду только в том случае, если предыдущая команда завершилась неудачно (ненулевой код выхода).

Например, предположим, что вы хотите создать каталог, а затем немедленно перейти в него. Если создание каталога не удалось или переход в него не сработал, вы можете захотеть отобразить сообщение об ошибке:

mkdir new_directory &&cd new_directory ||echo"Не удалось создать и получить доступ к каталогу"

Здесь mkdir new_directory пытается создать папку. Если это сработает, код немедленно выполняет cd new_directory. Если любой из шагов не удался, оператор || срабатывает и выводит сообщение об ошибке.

Заключительные мысли

Коды выхода могут показаться мелочью, но они являются частью того, что делает инструменты командной строки такими мощными. Они создают общий язык для программ, чтобы сообщать о успехе и неудаче, что имеет решающее значение для построения сложных систем.

Если вы новичок в работе с командной строкой, начните с того, чтобы привыкнуть проверять echo $?, когда команды ведут себя не так, как ожидалось. Скоро вы начнете использовать коды выхода в своих собственных скриптах и оцените эту простую, но эффективную систему коммуникации.