Cron job monitoring that notices the run which never happened

A cron job that crashes writes to a log nobody reads. A cron job that stops being scheduled writes nothing at all — the backup quietly stops, and you find out when you need to restore. KEEPitALIVE expects the ping and tells you when it does not arrive.

HOW IT WORKS

One curl line at the end of the job

Append a URL to the crontab line. The monitor knows the schedule, so a run that does not report is a run that failed.

  1. 1GET /heartbeat/{token}/startoptional — opens the run so duration is measuredrun open
  2. 2GET /heartbeat/{token}/$?the job's own exit status, 0-2550 = up
  3. 3-- nothing arrivesthe scheduled window passes plus gracealert

WHAT YOU GET

More than "it pinged"

  • Schedule-aware missed runs

    Give the monitor the same cron expression and timezone as the job. A nightly 02:00 backup is expected at 02:00 in your zone, across DST, instead of "some time in the last 24 hours". A grace period absorbs a job that starts late without crying wolf.

  • POSIX exit codes

    End the line with /$? and the job reports what actually happened: 0 succeeds, anything from 1 to 255 fails, and the code is kept on the check. No branching in the crontab, no wrapper script deciding what counts as an error.

  • Run duration and stuck jobs

    Ping /start when the job begins and the finishing beat records how long it took. A run that opens and never closes is reported stuck once its next scheduled slot plus grace has passed — the failure mode a plain heartbeat cannot see, because nothing ever arrives to be late.

  • Captured output

    POST up to 4 KB of the job's own output with the beat and it is stored beside the exit code, so the failing run carries its stderr instead of sending you to the server to find it.

AUTOMATION

React to the payload, not just the outage

Exit code and duration land in the check payload, so a trigger can match on them and act — open an incident, call an HTTP endpoint, or route the alert somewhere specific.

EXAMPLE RULES
  • if: payload.exit_code != 0->Open an incident
  • if: payload.duration_ms > 900000->Notify #ops
  • if: payload.exit_code == 137->POST to the runbook

ALERTING

Told where you already are

A missed window, a non-zero exit and a stuck run each raise an alert on the channels you already watch.

DELIVERS TO
  • Slack
  • Discord
  • Email
  • Microsoft Teams
  • PagerDuty
  • Telegram
  • Webhook

GET STARTED

Watch your first job free

The free plan covers 25 monitors with no card and no credit accounting at all. On the paid plans a cron monitor is priced by how often it is scheduled, so a nightly job is about as cheap as a monitor gets.

READ THE HEARTBEAT GUIDE

FAQ

Common questions

How does it know a cron job did not run?

You give the monitor the job's cron expression and timezone, so it knows when the next run is due. If no ping arrives by that time plus the grace period you set, the monitor goes down and alerts. Nothing has to happen on your server for the alert to fire, which is the whole point: a server that is off still triggers it.

Do I have to install an agent?

No. A cron job reports with one curl line appended to the existing crontab entry, and anything that can make an HTTP request works the same way — a shell script, a systemd timer, a CI job, a Kubernetes CronJob, or a few lines in any language.

Can it tell a failed run from a missed one?

Yes, and they are different alerts. A missed run means nothing reported inside the scheduled window. A failed run means the job reported a non-zero exit code: end the crontab line with /$? and the job's own status is what gets recorded, with the code kept on the check.

What about a job that hangs instead of failing?

Ping /start at the beginning of the job. That opens a run, and the finishing beat closes it and records the duration. If the run is still open once the next scheduled slot plus grace has passed, it is reported as stuck — the case a plain heartbeat misses entirely, because a hung job never sends anything to be late.

Can I see why the job failed without logging into the server?

Post the output with the beat — up to 4 KB is stored on the check alongside the exit code and duration. Triggers can match on those fields too, so a specific exit code can open an incident or call another endpoint.

How much does monitoring a nightly job cost?

On the free plan, nothing: 25 monitors, no card, and no credit accounting. On the paid plans a cron monitor is costed from its schedule rather than a polling interval, because nothing is polled — it waits for your ping. A nightly job is one credit against an allowance of a thousand or more, so what you pay tracks how often the job actually runs.