Zpět na blog

Jak monitorovat cron úlohy: 5 vzorů s heartbeat kontrolami

· 7 min čtení

Cron úlohy selhávají potichu. Pět heartbeat vzorů - od dead man's switch přes obal exit kódu po grace okna - abyste se o selhání dozvěděli první.

Jak monitorovat cron úlohy: 5 vzorů s heartbeat kontrolami

Cron je vynikající ve spouštění věcí podle plánu a katastrofální v tom, aby vám řekl, když to neudělá. Záloha, která přestane běžet, málokdy vyhodí chybu, kterou uvidíte. Prostě potichu nedělá nic a zjistíte to o týdny později, když zálohu potřebujete a ona tam není. Toto je problém tichého selhání a právě proto každá plánovaná úloha, na které záleží, potřebuje heartbeat kontrolu.

Heartbeat (neboli "dead man's switch") obrací logiku naruby. Místo upozornění, když je něco špatně, vaše úloha pingne monitorovací endpoint, když je všechno v pořádku. Pokud očekávaný ping nepřijde včas, monitor upozorní. Žádný ping, žádné zprávy, velký problém.

Níže je pět vzorů, od nejjednoduššího po nejrobustnější. Všechny předpokládají, že máte heartbeat URL z vašeho monitorovacího nástroje.

Vzor 1: Klasický dead man's switch

Nejjednodušší možné nastavení. Vaše úloha po dokončení zavolá URL. Pokud monitor v očekávaném okně nedostane zprávu, upozorní.

# Denní záloha v 02:30, ping po dokončení
30 2 * * * /usr/local/bin/backup.sh && curl -fsS https://vas-monitor/ping/abc123

Na && záleží: curl se spustí jen tehdy, pokud backup.sh skončí s kódem 0 (úspěch). Pokud záloha selže, žádný ping se neodešle a monitor to zachytí. Přepínače -fsS způsobí, že curl při HTTP chybách selže potichu, ale skutečné problémy stále ukáže.

Slabina: potvrdí jen to, že skript běžel a skončil nulou. Pokud skript spolkne vlastní chyby a stejně skončí nulou, dostanete falešné "vše v pořádku."

Vzor 2: Ping jen při skutečném úspěchu

Signál úspěchu udělejte explicitním namísto spoléhání se na řetězení exit kódů v shellu. Ve skriptech s více kroky je to jasnější.

#!/bin/bash
set -euo pipefail   # při jakékoli chybě spadni hlasitě
run_the_backup
verify_the_backup    # opravdu ověř, že výstup existuje a dává smysl
curl -fsS https://vas-monitor/ping/abc123   # dosaženo jen pokud všechno výše prošlo

set -euo pipefail znamená, že jakýkoli neúspěšný příkaz přeruší skript ještě před pingem. Přidání reálného ověřovacího kroku (existuje soubor zálohy, je větší než nula bajtů) zavírá díru "skončil nulou, ale nic neudělal" ze Vzoru 1.

Vzor 3: Obalovač exit kódu

Když nemůžete upravit samotnou úlohu (binárka třetí strany, dodavatelský skript), obalte ji. Obalovač signalizuje start, spustí úlohu a nahlásí exit kód.

#!/bin/bash
URL=https://vas-monitor/ping/abc123
curl -fsS "$URL/start"                  # signál "spustil jsem se"
/opt/vendor/report-generator            # úloha, kterou neovládáte
EXIT=$?
curl -fsS "$URL/$EXIT"                   # nahlas exit kód

Signalizování startu umožní monitoru i měřit délku běhu a odhalit úlohu, která se spustila, ale nikdy neskončila (zasekla se). Nahlášení exit kódu mu umožní rozlišit "proběhlo v pořádku" od "proběhlo a selhalo".

Vzor 4: Podmíněný ping (pingni jen když práce měla význam)

Některé úlohy běží podle plánu, ale skutečnou práci dělají jen někdy (procesor fronty, který často najde frontu prázdnou). Nechcete upozornění na "chybějící heartbeat", když úloha legitimně neudělala nic. Pingněte jen tehdy, když se skutečná práce udála, a podle toho rozšiřte plán.

#!/bin/bash
PROCESSED=$(process_queue)
if [ "$PROCESSED" -gt 0 ]; then
  curl -fsS "https://vas-monitor/ping/abc123?count=$PROCESSED"
fi

Očekávanou periodu monitoru nastavte na nejdelší reálnou mezeru mezi skutečnými běhy. Daní je citlivost: delší okno znamená pomalejší detekci, takže to používejte jen tehdy, když je nepravidelná práce opravdu očekávaná.

Vzor 5: Jitter a grace okna

Reálné plány driftují. Úloha nastavená na 02:00 se může spustit v 02:00:04 kvůli zátěži a délka běhu denní úlohy kolísá. Pokud monitor očekává ping přesně v intervalu, normální jitter vás zbytečně vyburcuje.

Řešením je grace perioda: řekněte monitoru, aby po očekávaném čase počkal ještě jistou rezervu, než upozorní. Denní záloha, která obvykle trvá 8 minut, může použít 20minutové grace okno. Také chcete jistý jitter v samotném plánování, když máte hodně úloh, aby nezatěžovaly tentýž zdroj ve stejnou sekundu:

# Přidej malé náhodné zpoždění (0-59s), aby se úlohy v 02:00 rozložily
0 2 * * * sleep $((RANDOM % 60)) && /usr/local/bin/backup.sh && curl -fsS https://vas-monitor/ping/abc123

Grace okna jsou rozdíl mezi monitorem, kterému věříte, a tím, který po třetím falešném poplachu ztišíte. Grace nastavte tak, aby pohodlně přesahovalo nejhorší reálný čas běhu úlohy, ne její průměr.

Rychlý přehled

Vzor Nejlepší pro Zachytí
Dead man's switch Jednoduché úlohy s jedním příkazem Úloha neběžela / skončila nenulově
Ping při úspěchu Vícekrokové skripty Tiché "skončil nulou, ale nic neudělal"
Obalovač exit kódu Úlohy, které nemůžete upravit Zaseknutí, reálné exit kódy, trvání
Podmíněný ping Úlohy s nepravidelnou prací Selhání bez falešných "chybějících" upozornění
Jitter a grace Cokoli s proměnlivým časem běhu Odstraní falešné poplachy z driftu

Jak to uvést do praxe

Začněte Vzorem 1 na nejdůležitější úloze ještě dnes (záloha, fakturační běh, synchronizace dat). Přidejte ověření (Vzor 2) a grace okno (Vzor 5), než se na něj začnete spoléhat. Podrobnější návod ke konfiguraci heartbeatu najdete v našem průvodci monitorování cron úloh přes heartbeat.

Pokud vaše úloha komunikuje se službou přes konkrétní port, dosažitelnost si nejprve ověříte bezplatným kontrolérem portů. A až budete připraveni monitorovat plánované úlohy spolu s weby a API na jednom místě, podívejte se na jak funguje monitoring dostupnosti ePulz.io - 7denní zkušební doba je zdarma, bez karty.

Sdílet: Odkaz zkopírován

Vyzkoušejte ePulz.io zdarma - 7 dní bez kreditní karty.

Vytvořit účet