← Назад к вопросам

Как посмотреть exit code в Linux

1.0 Junior🔥 201 комментариев
#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое 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

  1. Отладка скриптов:

    #!/bin/bash
    set -e  # Прерывать скрипт при первой ошибке (ненулевой exit code)
    set -o pipefail  # Учитывать ошибки в любом месте конвейера
    
  2. Автоматизация и CI/CD:

    # В Jenkinsfile, GitLab CI или скрипте развёртывания
    if deployment_script; then
        echo "Deployment successful"
    else
        echo "Deployment failed with code: $?"
        rollback_changes
        exit 1  # Пробрасываем ошибку дальше
    fi
    
  3. Мониторинг и алертинг:

    # Простейшая 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 — базовый навык, отличающий надёжную автоматизацию от хрупкой. Это позволяет создавать отказоустойчивые конвейеры, эффективно отлаживать проблемы и правильно проектировать взаимодействие между компонентами системы.

Как посмотреть exit code в Linux | PrepBro