Как посмотреть exit code в Linux
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Exit Code и как его посмотреть в Linux
Exit Code (код завершения или код возврата) — это числовое значение, которое возвращает процесс операционной системе после своего завершения. Это фундаментальный механизм в Linux/Unix-системах для передачи информации о результате выполнения программы: успех, ошибка или специфическое состояние.
Основные способы просмотра Exit Code
1. Специальная переменная $?
Самый простой и распространённый способ — использовать встроенную переменную оболочки $?. Она всегда содержит код завершения последней выполненной команды.
# Пример 1: Успешное выполнение
ls /tmp
echo "Exit code: $?" # Выведет: Exit code: 0
# Пример 2: Ошибка (файл не существует)
ls /несуществующий_файл
echo "Exit code: $?" # Выведет не 0 (обычно 2)
Важно: $? обновляется после выполнения каждой команды, поэтому её нужно проверять сразу.
2. Проверка в интерактивной оболочке сразу после выполнения
В современных оболочках (Bash, Zsh) код часто отображается автоматически, если команда завершилась с ошибкой. Например, в Bash с включённой опцией set -o pipefail или в Zsh с настроенным PROMPT, который показывает код.
3. Использование в скриптах с условными операторами
В скриптах код завершения используется для принятия решений:
#!/bin/bash
grep "pattern" /some/file.txt
if [ $? -eq 0 ]; then
echo "Pattern found"
else
echo "Pattern not found or error. Exit code: $?"
fi
Более идиоматичный способ — проверять команду напрямую в условии:
if grep "pattern" /some/file.txt; then
echo "Found"
fi
Значения Exit Code
- 0 — Успешное завершение. Это стандарт для всех POSIX-совместимых программ.
- 1-255 — Ошибка или специфическое состояние. Значения трактуются программой, но есть общепринятые:
* **1** — Общая ошибка (Catchall for general errors).
* **2** — Неправильное использование встроенных команд оболочки (часто "файл не найден" для утилит).
* **126** — Команда найдена, но не является исполняемой.
* **127** — Команда не найдена ("command not found").
* **128+N** — Завершение сигналом. Если процесс убит сигналом N, его Exit Code будет `128 + N`. Например, `SIGKILL (9)` даст код `137`.
Продвинутые сценарии и инструменты
Просмотр кода для фоновых процессов или подпроцессов
some_command &
wait $! # Ждём завершения последнего фонового процесса
echo "Background job exit code: $?"
Использование PIPESTATUS в Bash
При использовании конвейеров (pipes) $? показывает код последней команды в цепочке. Массив ${PIPESTATUS[@]} хранит коды всех команд в последнем конвейере.
ls /tmp | grep "tmp" | wc -l
echo "Last command exit code: $?"
echo "All pipe codes: ${PIPESTATUS[@]}"
Инструмент wait для конкретных PID
/path/to/long_running_script.sh &
PID=$!
wait $PID
echo "Script finished with code: $?"
Практические примеры для DevOps
-
Отладка скриптов:
#!/bin/bash set -e # Прерывать скрипт при первой ошибке (ненулевой exit code) set -o pipefail # Учитывать ошибки в любом месте конвейера -
Автоматизация и CI/CD:
# В Jenkinsfile, GitLab CI или скрипте развёртывания if deployment_script; then echo "Deployment successful" else echo "Deployment failed with code: $?" rollback_changes exit 1 # Пробрасываем ошибку дальше fi -
Мониторинг и алертинг:
# Простейшая health-проверка сервиса в cron if ! curl -f http://localhost:8080/health; then echo "Service unhealthy. Exit code: $?" | mail -s "ALERT" admin@example.com fi
Ключевые выводы для инженера
- Всегда проверяйте
$?в критичных скриптах автоматизации, особенно перед принятием решений. - Нулевой код — не всегда абсолютный успех. Некоторые программы могут возвращать 0 даже при частичных проблемах. Всегда изучайте документацию к ключевым утилитам (например,
curl,tar,systemctl). - Используйте
set -eиset -o pipefailв production-скриптах для повышения надёжности. - Коды 126-137 часто указывают на проблемы с окружением, правами или сигналами ОС — это первое, что стоит проверять при таких ошибках.
- В контейнерах Docker exit code контейнера — это exit code его entrypoint/команды, что критично для оркестраторов (Kubernetes, Docker Swarm).
Понимание и грамотная обработка exit codes — базовый навык, отличающий надёжную автоматизацию от хрупкой. Это позволяет создавать отказоустойчивые конвейеры, эффективно отлаживать проблемы и правильно проектировать взаимодействие между компонентами системы.