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í.
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.
Vyzkoušejte ePulz.io zdarma - 7 dní bez kreditní karty.
Vytvořit účet