Ako monitorovať cron úlohy: 5 vzorov s heartbeat kontrolami
· 7 min čítania
Cron úlohy zlyhávajú potichu. Päť heartbeat vzorov - od dead man's switch cez obal exit kódu po grace okná - aby ste sa o zlyhaní dozvedeli prví.
Cron je vynikajúci v spúšťaní vecí podľa plánu a katastrofálny v tom, aby vám povedal, keď to nespraví. Záloha, ktorá prestane bežať, málokedy vyhodí chybu, ktorú uvidíte. Jednoducho potichu nerobí nič a zistíte to o týždne neskôr, keď zálohu potrebujete a ona tam nie je. Toto je problém tichého zlyhania a práve preto každá plánovaná úloha, na ktorej záleží, potrebuje heartbeat kontrolu.
Heartbeat (alebo "dead man's switch") prevracia logiku naopak. Namiesto upozornenia, keď je niečo zle, vaša úloha pingne monitorovací endpoint, keď je všetko v poriadku. Ak očakávaný ping nepríde načas, monitor upozorní. Žiadny ping, žiadne správy, veľký problém.
Nižšie je päť vzorov, od najjednoduchšieho po najrobustnejší. Všetky predpokladajú, že máte heartbeat URL z vášho monitorovacieho nástroja.
Vzor 1: Klasický dead man's switch
Najjednoduchšie možné nastavenie. Vaša úloha po dokončení zavolá URL. Ak monitor v očakávanom okne nedostane správu, upozorní.
# Denná záloha o 02:30, ping po dokončení
30 2 * * * /usr/local/bin/backup.sh && curl -fsS https://vas-monitor/ping/abc123
Na && záleží: curl sa spustí len vtedy, ak backup.sh skončí s kódom 0 (úspech). Ak záloha zlyhá, žiadny ping sa neodošle a monitor to zachytí. Prepínače -fsS spôsobia, že curl pri HTTP chybách zlyhá potichu, no skutočné problémy stále ukáže.
Slabina: potvrdí len to, že skript bežal a skončil nulou. Ak skript prehltne vlastné chyby a aj tak skončí nulou, dostanete falošné "všetko v poriadku."
Vzor 2: Ping len pri skutočnom úspechu
Signál úspechu urobte explicitným namiesto spoliehania sa na reťazenie exit kódov v shelli. V skriptoch s viacerými krokmi je to jasnejšie.
#!/bin/bash
set -euo pipefail # pri akejkoľvek chybe spadni hlasno
run_the_backup
verify_the_backup # naozaj over, že výstup existuje a dáva zmysel
curl -fsS https://vas-monitor/ping/abc123 # dosiahnuté len ak všetko vyššie prešlo
set -euo pipefail znamená, že akýkoľvek neúspešný príkaz preruší skript ešte pred pingom. Pridanie reálneho overovacieho kroku (existuje súbor zálohy, je väčší ako nula bajtov) zatvára dieru "skončil nulou, ale nič neurobil" zo Vzoru 1.
Vzor 3: Obaľovač exit kódu
Keď nemôžete upraviť samotnú úlohu (binárka tretej strany, dodávateľský skript), obaľte ju. Obaľovač signalizuje štart, spustí úlohu a nahlási exit kód.
#!/bin/bash
URL=https://vas-monitor/ping/abc123
curl -fsS "$URL/start" # signál "spustil som sa"
/opt/vendor/report-generator # úloha, ktorú neovládate
EXIT=$?
curl -fsS "$URL/$EXIT" # nahlás exit kód
Signalizovanie štartu umožní monitoru aj merať dĺžku behu a odhaliť úlohu, ktorá sa spustila, no nikdy neskončila (zasekla sa). Nahlásenie exit kódu mu umožní rozlíšiť "prebehlo v poriadku" od "prebehlo a zlyhalo".
Vzor 4: Podmienený ping (pingni len keď práca mala význam)
Niektoré úlohy bežia podľa plánu, no skutočnú prácu robia len niekedy (procesor frontu, ktorý často nájde front prázdny). Nechcete upozornenie na "chýbajúci heartbeat", keď úloha legitímne neurobila nič. Pingnite len vtedy, keď sa skutočná práca udiala, a podľa toho rozšírte plán.
#!/bin/bash
PROCESSED=$(process_queue)
if [ "$PROCESSED" -gt 0 ]; then
curl -fsS "https://vas-monitor/ping/abc123?count=$PROCESSED"
fi
Očakávanú periódu monitora nastavte na najdlhšiu reálnu medzeru medzi skutočnými behmi. Daňou je citlivosť: dlhšie okno znamená pomalšiu detekciu, takže to používajte len vtedy, keď je nepravidelná práca naozaj očakávaná.
Vzor 5: Jitter a grace okná
Reálne plány driftujú. Úloha nastavená na 02:00 sa môže spustiť o 02:00:04 kvôli záťaži a dĺžka behu dennej úlohy kolíše. Ak monitor očakáva ping presne v intervale, normálny jitter vás zbytočne vyburcuje.
Riešením je grace perioda: povedzte monitoru, aby po očakávanom čase počkal ešte istú rezervu, než upozorní. Denná záloha, ktorá zvyčajne trvá 8 minút, môže použiť 20-minútové grace okno. Tiež chcete istý jitter v samotnom plánovaní, keď máte veľa úloh, aby nezaťažovali ten istý zdroj v rovnakej sekunde:
# Pridaj malé náhodné oneskorenie (0-59s), aby sa úlohy o 02:00 rozložili
0 2 * * * sleep $((RANDOM % 60)) && /usr/local/bin/backup.sh && curl -fsS https://vas-monitor/ping/abc123
Grace okná sú rozdiel medzi monitorom, ktorému veríte, a tým, ktorý po treťom falošnom poplachu stíšite. Grace nastavte tak, aby pohodlne presahovalo najhorší reálny čas behu úlohy, nie jej priemer.
Rýchly prehľad
| Vzor | Najlepší pre | Zachytí |
|---|---|---|
| Dead man's switch | Jednoduché úlohy s jedným príkazom | Úloha nebežala / skončila nenulovo |
| Ping pri úspechu | Viackrokové skripty | Tiché "skončil nulou, ale nič neurobil" |
| Obaľovač exit kódu | Úlohy, ktoré nemôžete upraviť | Zaseknutia, reálne exit kódy, trvanie |
| Podmienený ping | Úlohy s nepravidelnou prácou | Zlyhania bez falošných "chýbajúcich" upozornení |
| Jitter a grace | Čokoľvek s premenlivým časom behu | Odstráni falošné poplachy z driftu |
Ako to uviesť do praxe
Začnite Vzorom 1 na najdôležitejšej úlohe ešte dnes (záloha, fakturačný beh, synchronizácia dát). Pridajte overenie (Vzor 2) a grace okno (Vzor 5), kým sa naň začnete spoliehať. Podrobnejší návod ku konfigurácii heartbeatu nájdete v našom sprievodcovi monitorovanie cron úloh cez heartbeat.
Ak vaša úloha komunikuje so službou cez konkrétny port, dosiahnuteľnosť si najprv overíte bezplatným kontrolérom portov. A keď budete pripravení monitorovať plánované úlohy spolu s webmi a API na jednom mieste, pozrite si ako funguje monitoring dostupnosti ePulz.io - 7-dňová skúšobná doba je zadarmo, bez karty.
Vyskúšajte ePulz.io zadarmo - na 7 dní bez potreby kreditnej karty.
Vytvoriť účet