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.