Guides 6 min. leestijd

Cron-jobs monitoren met heartbeats

Cron-jobs falen stil. Een heartbeatmonitor waarschuwt je als een geplande job zich niet op tijd meldt. Hoe heartbeats werken, hoe je er een aan een crontab toevoegt en welke instellingen je kiest.

Om een cron-job te monitoren geef je hem een heartbeat: een unieke URL die de job aanroept telkens als hij klaar is. Een monitoringdienst verwacht dat verzoek met een vast interval. Komt het niet op tijd binnen, omdat de job niet draaide, crashte of bleef hangen, dan krijg je een melding. Het kost één extra regel in je crontab.

Deze gids laat zien hoe heartbeats werken, hoe je er een toevoegt en hoe je de juiste instellingen kiest.

Waarom cron-jobs hun eigen monitoring nodig hebben

Cron is betrouwbaar in het starten van commando’s en zwijgt over wat er daarna gebeurt. Als een back-upscript om 02:00 mislukt, gaat er niets zichtbaars kapot. De website blijft online en uptimechecks blijven groen. Je ontdekt het weken later, wanneer je de back-up nodig hebt en die er niet is.

Typische stille fouten:

De server lag eruit of was aan het herstarten op het geplande tijdstip.

De crontab werd overschreven tijdens een deployment of servermigratie.

Het commando faalt onder cron omdat PATH of andere omgevingsvariabelen anders zijn dan in je shell.

Het script draait, maar blijft hangen op een lock, een netwerkaanroep of een volle schijf.

Inloggegevens zijn verlopen, dus de job start en stopt met een fout die niemand leest.

Uptime monitoring ziet hier niets van, omdat er publiek niets kapotgaat. Een heartbeat werkt andersom: in plaats van dat de monitor je job controleert, meldt je job zich bij de monitor.

Hoe een heartbeat werkt

Je maakt een heartbeatmonitor aan en krijgt een unieke URL.

Je stelt in wanneer de job naar verwachting draait, als interval zoals elke 24 uur of als het eigen crontab-schema van de job, met wat marge voor trage runs.

De job roept de URL aan met GET of POST als hij klaar is.

Komt er niet op tijd een verzoek binnen, dan wordt er een incident geopend en gaan er meldingen uit.

Zodra de volgende ping binnenkomt, herstelt de heartbeat en krijg je een herstelmelding.

De cron-monitors van Uptimecheck werken zo. Ze nemen het crontab-schema in jouw tijdzone over, accepteren start- en eindpings op één monitor, sturen een melding als een run de maximale looptijd overschrijdt, en kunnen de exitcode en de uitvoer van de job vastleggen. Meldingen gaan naar e-mail, Slack, Microsoft Teams, Discord, Google Chat, Mattermost, Telegram, PagerDuty, ntfy, Pushover, webhooks en pushmeldingen op je telefoon, op elk abonnement.

Een heartbeat toevoegen aan een crontab

Stel dat er elke nacht om 02:30 een back-up draait:

30 2 * * * /usr/local/bin/backup.sh

Zet de ping achter de job, gekoppeld met &&, zodat hij alleen draait als de back-up slaagt:

30 2 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 –retry 3 https://heartbeat.example.com/your-unique-id > /dev/null

Wat de curl-opties doen:

-f laat curl falen bij HTTP-fouten, in plaats van ze als succes te behandelen.

-s houdt het stil, en -S toont toch fouten als er iets misgaat.

-m 10 stopt na 10 seconden met wachten, zodat een traag netwerk de job nooit blokkeert.

–retry 3 probeert het opnieuw bij korte netwerkproblemen.

Gebruik de exacte URL van je heartbeatmonitor in plaats van de placeholder.

Pingen vanuit een script

Zet bij langere scripts de ping aan het eind van het script zelf, na de stappen die ertoe doen:

#!/usr/bin/env bash
set -euo pipefail

pg_dump northwind > /backups/northwind-$(date +%F).sql
gzip /backups/northwind-$(date +%F).sql

curl -fsS -m 10 –retry 3 https://heartbeat.example.com/your-unique-id > /dev/null

Met set -e stopt het script bij het eerste commando dat faalt, dus de ping wordt alleen verstuurd als alles daarvoor gelukt is.

Andere schedulers

Heartbeats zijn niet beperkt tot cron. Alles wat een HTTP-verzoek kan doen, kan pingen: systemd-timers, Windows Taakplanner met Invoke-WebRequest van PowerShell, een Kubernetes CronJob, een CI-pipeline of een geplande functie in je applicatie.

Het interval kiezen

Het interval moet passen bij het schema: 24 uur voor een nachtelijke job, 1 uur voor een job die elk uur draait. Laat marge voor de normale variatie in hoe lang de job duurt. Duurt een back-up meestal 20 minuten maar soms 50, dan voorkomt een extra uur marge valse alarmen zonder een echte fout lang te verbergen.

Begin ruim, kijk een week of twee hoe lang de runs echt duren en maak het daarna strakker. Accepteert je monitor de crontab-expressie zelf, zoals die van Uptimecheck, plak dan het schema en kies de tijdzone van de server. De verwachte tijden volgen dan precies het schema, en de marge wordt een respijtperiode.

Heartbeats vergeleken met andere aanpakken

Er zijn andere manieren om geplande jobs in de gaten te houden, elk met gaten:

E-mail vanuit cron. Cron kan de uitvoer van commando’s mailen, maar alleen als de job draait en uitvoer geeft. Start de job nooit, dan komt er geen mail. De meeste van deze mails worden toch niet gelezen.

Logmonitoring. Handig om fouten te vinden, maar een job die nooit draaide, schrijft geen logregel om op te zoeken.

Resultaten controleren. Sommige teams controleren of een back-upbestand bestaat of een tabel is bijgewerkt. Dat werkt, maar vraagt om maatwerkchecks voor elke job.

Een heartbeat werkt voor elke job op dezelfde manier en vangt het geval dat de andere missen: de job die helemaal niet draaide.

Langlopende jobs

Ping bij jobs die lang duren, zoals grote back-ups of datamigraties, zowel aan het begin als aan het eind. Komt de startping binnen maar de eindping niet, dan is de job halverwege blijven hangen of gecrasht. Zo weet je waar je moet zoeken voordat je ook maar één logbestand opent.

In Uptimecheck gaan beide pings naar dezelfde monitor: roep de URL met /start erachter aan als de job begint, en de gewone URL als hij klaar is. De tijd daartussen wordt vastgelegd als looptijd, en als je een maximale looptijd instelt, krijg je een melding wanneer een run langer duurt.

Welke jobs een heartbeat verdienen

Niet elke job heeft er een nodig. Geef voorrang aan jobs waarvan je een fout pas later zou merken:

Back-ups van databases en bestanden.

Data-imports en -exports, zoals productfeeds of synchronisaties met de boekhouding.

Factuurruns, verlengingen en billingjobs.

Jobs die certificaten vernieuwen.

Opschoonjobs die voorkomen dat een schijf volloopt.

Rapportages waar anderen op rekenen.

Geef elke job zijn eigen heartbeat. Een gedeelde heartbeat vertelt je dat er iets niet draaide, maar niet wat.

Een gemiste heartbeat oplossen

Als er een heartbeatmelding binnenkomt:

Controleer of cron de job heeft gestart. Kijk in de cron- of systeemlog.

Voer het commando met de hand uit als dezelfde gebruiker die cron gebruikt, en lees de uitvoer.

Controleer de omgeving. Gebruik absolute paden, of stel PATH in bovenaan de crontab.

Controleer de resources. Een volle schijf of uitgeput geheugen stopt veel jobs. Servermonitoring toont schijf, RAM en load op het moment van de fout.

Controleer het uitgaande netwerk. Een wijziging in de firewall kan de ping blokkeren, ook als de job werkt. Draaide de job maar mislukte de ping, dan staat de fout van curl in de uitvoer van de job.

Stuur de uitvoer van de job door naar een logbestand, zodat er altijd iets te lezen is:

30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1 && curl -fsS -m 10 https://heartbeat.example.com/your-unique-id > /dev/null

Je kunt het resultaat ook met de ping meesturen. In Uptimecheck meld je hoe de job eindigde door de URL af te sluiten met de exitcode (/0 betekent succes, al het andere een fout), en een POST-body wordt bewaard als uitvoer van de job en bij de melding getoond. Deze regel pingt bij de start, voert de job uit en meldt de exitcode en de uitvoer:

30 2 * * * curl -fsS -m 10 –retry 3 -o /dev/null https://heartbeat.example.com/your-unique-id/start; /usr/local/bin/backup.sh > /tmp/backup.log 2>&1; curl -fsS -m 10 –retry 3 –data-binary @/tmp/backup.log -o /dev/null https://heartbeat.example.com/your-unique-id/$?

Checklist voor het monitoren van cron-jobs

Zet de geplande jobs die ertoe doen op een rij, op elke server.

Maak één heartbeat per job aan.

Ping nadat het werk is gelukt, gekoppeld met && of aan het eind van een script met set -e.

Stem het interval af op het schema, met marge voor trage runs.

Log de uitvoer van de job naar een bestand.

Stuur meldingen naar een kanaal dat iemand leest, ook ’s nachts voor kritieke jobs.

Bekijk de heartbeathistorie na deployments en servermigraties.

Samenvatting

Cron vertelt je niet wanneer een job mislukt. Een heartbeat wel. Eén curl-regel per job maakt van stille fouten meldingen, en de historie laat precies zien wanneer elke job voor het laatst draaide.

Heartbeats zitten in elk abonnement van Uptimecheck, samen met uptime-, SSL-, domein-, DNS- en servermonitoring. Probeer het 14 dagen gratis, geen creditcard nodig.

Vragen

Wat is een heartbeat voor een cron-job?

Een heartbeat is een unieke URL die een geplande job aanroept telkens als hij draait. De monitoringdienst verwacht dat verzoek binnen een ingesteld interval en waarschuwt je als het niet binnenkomt.

Moet de ping vóór of na de job komen?

Nadat het werk succesvol is afgerond. Door de ping te koppelen met && pingt een mislukte job niet, dus je krijgt een melding zowel als de job niet draait als wanneer hij draait maar faalt.

Werkt een heartbeat met systemd-timers, Windows Taakplanner of Kubernetes CronJobs?

Ja. Alles wat een HTTP-verzoek kan versturen als het klaar is, kan een heartbeat pingen, ongeacht wat het inplant.

Wat gebeurt er als mijn server down is wanneer de job zou moeten draaien?

De job draait niet, de ping komt niet binnen en je krijgt een melding. Dat is precies een van de gevallen waarvoor heartbeats bedoeld zijn.

Lees verder

Guides 3 min. leestijd

Voorkom gemiste taken: zorg dat je cronjobs soepel draaien

Backups, imports en opruimtaken draaien via cron, en ze falen zonder dat iemand het merkt. De meest voorkomende oorzaken van gemiste cronjobs, hoe je ze oplost en hoe je een melding krijgt als een job niet draait.

Lezen

Downtime is verleden tijd.

Stel je eerste monitor in binnen een minuut, of kijk eerst rond in de live demo.

14 dagen gratis proberen · Daarna gratis met 5 monitors · Geen creditcard