Мониторинг обязан быть надёжнее того, что он мониторит. Практически это значит одно: пинг никогда не должен ни задерживать вашу задачу, ни ронять её.
У curl по умолчанию нет общего
лимита времени. Зависший сокет — не редкость (потерянные
пакеты, чёрная дыра на файрволе, DNS без ответа), и без
таймаута cron-задача будет висеть, пока её не убьют.
curl -fsS -m 10 --connect-timeout 5 --retry 3 -o /dev/null https://ping.cronalive.com/<uuid>
| Флаг | Что делает |
|---|---|
-m 10 | жёсткий предел на весь запрос, включая ретраи |
--connect-timeout 5 | отдельный предел на установку соединения |
--retry 3 | повтор при сетевой ошибке и 5xx, пауза удваивается |
--retry-connrefused | считать «connection refused» поводом для повтора (по умолчанию — нет) |
-f | ненулевой код выхода на 4xx/5xx — иначе curl «успешен» на любой ответ |
-s -S | без прогресс-бара, но с текстом ошибки: cron иначе шлёт письмо на каждый запуск |
Ориентир: пинг — это несколько сотен байт. Десяти секунд на весь запрос хватает с запасом, а 30 и больше уже сравнимы с интервалом частых задач.
Соблазн понятен: дописать & и
не ждать сеть вовсе. Так делать не стоит:
curl без -m живёт неограниченно долго. Задача раз в минуту — и через сутки на сервере тысячи зависших процессов;Если фоновый запуск всё-таки нужен (например, пинг из интерактивного скрипта), таймаут обязателен:
# так — можно curl -fsS -m 10 -o /dev/null "$PING" & # так — нет: процесс может не завершиться никогда curl "$PING" &
Недоступность мониторинга — не повод останавливать бэкап.
Глушите ошибку явно, особенно если скрипт запущен с
set -e:
signal() { curl -fsS -m 10 --retry 3 -o /dev/null "$PING$1" || true; } В сниппетах для Python, Node и PHP то же самое сделано через перехват исключения. Наши SDK ведут себя так же по умолчанию: сигнал либо уходит быстро, либо молча теряется.
Ничего страшного — и это осознанное поведение, а не снисхождение. Потерянный пинг не нужно навёрстывать:
--retry вместе с разумным grace.Ретраить сигнал в цикле внутри задачи не нужно: это удвоит задержку и не добавит информации.
Приём пингов живёт на нескольких доменах и деплоится независимо от дашборда. Актуальный список отдаёт открытый эндпоинт:
curl -s https://app.cronalive.com/api/v1/ping-domains
В сниппетах на странице чека запасной домен уже подставлен
через || — вторая попытка уходит
только если первая не удалась:
curl -fsS -m 10 https://ping.cronalive.com/<uuid> || curl -fsS -m 10 https://ping2.cronalive.com/<uuid>
SDK читают этот список сами. Список может пополняться — хардкодить его в своих скриптах не стоит.
Пинги ограничены, но так, чтобы никогда не ломать heartbeat-клиент:
Ключевая деталь: отброшенный пинг получает в ответ
200 OK, а не 429. Так задумано. Клиент с
-f не должен считать это ошибкой
и не должен уходить в ретраи — иначе лимит породил бы шторм
повторов ровно в тот момент, когда система и так под
нагрузкой. Такой пинг просто не записывается, статус чека он
не меняет.
Практический вывод: если задача пингует чаще пяти раз в секунду, это почти наверняка цикл в скрипте, а не бизнес- требование. Мониторьте прогон целиком, а не каждую итерацию.
GET /api/v1/ping-domains.