Linux Labs

Bash: обработка текста и скрипты / Ступень 7 из 9

Код завершения и healthcheck

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 3 из 8 · теория · 4 мин

Условие по коду команды

Чтобы условие смотрело на curl, читать $? не нужно: if проверяет команду сам.

if запускает команду, которая стоит после него, и выбирает ветку по её коду: ноль — then, другое число — else. Квадратные скобки из урока об аргументах скрипта — тоже команда: [ $? -eq 0 ] сравнивает числа и завершается кодом 0 или 1. Поэтому curl ставят прямо в условие:

bash
URL=http://127.0.0.1:8080/health
if curl -s -o /dev/null "$URL"; then
    echo "OK"
else
    echo "FAIL"
    exit 1
fi

Короче то же пишут через && и ||. a && b запускает b, только если a завершилась с кодом 0, a || b — только если с другим. Если код понадобится позже, его сохраняют сразу: rc=$? — первой строкой после команды.

Свой код есть и у скрипта — это код его последней команды или число из exit. Таймер, cron и мониторинг читают этот код, напечатанный текст они не разбирают. Поэтому в ветке сбоя стоит exit 1: иначе скрипт, напечатавший FAIL, завершится кодом echo.

Проверь себя 1 вопрос

Скрипт check.sh — две строки. Приложение остановлено. Каким кодом завершится ./check.sh?

URL=http://127.0.0.1:8080/health
curl -s -o /dev/null "$URL" && echo OK || echo FAIL
  • 1 скрипт вернул бы с exit 1. Последней выполнилась echo FAIL, и код скрипта — её ноль: проверь ./check.sh; echo $?.

  • 7 — код curl, но после него выполнилась echo FAIL. Код скрипта — код последней команды, ноль.

curl упал, || запустил echo FAIL, и скрипт завершился её кодом — нулём. Таймер увидит успех, хотя на экране FAIL; честный код даёт exit 1 в ветке сбоя.

Главное в шаге

  • if команда выбирает ветку по коду этой команды; [ … ] — такая же команда.
  • a && b запускает b после успеха a, a || b — после сбоя.
  • Код скрипта — код его последней команды или число из exit; его читают таймер и мониторинг.
Ubuntu 24.04
Загрузка…