Späť na blog

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í.

Ako monitorovať cron úlohy: 5 vzorov s heartbeat kontrolami

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.

Zdieľať: Odkaz skopírovaný

Vyskúšajte ePulz.io zadarmo - na 7 dní bez potreby kreditnej karty.

Vytvoriť účet