Чтобы условие смотрело на curl, читать $? не нужно: if проверяет команду сам.
if запускает команду, которая стоит после него, и выбирает ветку по её коду: ноль — then, другое число — else. Квадратные скобки из урока об аргументах скрипта — тоже команда: [ $? -eq 0 ] сравнивает числа и завершается кодом 0 или 1. Поэтому curl ставят прямо в условие:
Короче то же пишут через && и ||. a && b запускает b, только если a завершилась с кодом 0, a || b — только если с другим. Если код понадобится позже, его сохраняют сразу: rc=$? — первой строкой после команды.
Свой код есть и у скрипта — это код его последней команды или число из exit. Таймер, cron и мониторинг читают этот код, напечатанный текст они не разбирают. Поэтому в ветке сбоя стоит exit 1: иначе скрипт, напечатавший FAIL, завершится кодом echo.
Скрипт 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; его читают таймер и мониторинг.