Skip to content
Cron job and heartbeat monitoring

Know when a cron job doesn’t run.

Backups, scheduled tasks and queue workers fail quietly: nothing crashes, nothing logs, they simply stop. Pingvella watches for the check-in that should arrive, and tells you when it doesn’t.

What is cron job monitoring?

Most monitoring waits for something to go wrong and report it. A job that never starts reports nothing, so it can’t raise an alarm itself. Heartbeat monitoring turns that around: the job sends a small “I’m alive” request when it finishes, and the monitor raises the alarm when that request stops arriving.

Define the expectation.

Name the job, say how often it should run (an interval or a cron expression, in any timezone) and how long to wait before worrying.

Send a check-in.

Add one HTTP request to the end of the job. Each check has its own private URL, so a run is always matched to the right job.

Act on the silence.

If the check-in is late, you see it. If it never comes, you’re alerted on every channel you chose, and again when the job recovers.

One line at the end of your job

Anything that can make an HTTP request can check in: a shell script, a Python or Node worker, a PHP scheduled command, a Kubernetes CronJob.

curl -fsS -m 10 --retry 5 -o /dev/null https://pingvella.com/ping/your-check-uuid

Want to know how long a run takes, or catch a job that starts and then fails? Wrap it:

curl -fsS -m 10 -o /dev/null https://pingvella.com/ping/your-check-uuid/start ./your-job.sh curl -fsS -m 10 -o /dev/null https://pingvella.com/ping/your-check-uuid/$?

The exit status on the end of the URL decides the outcome: 0 is a success, anything else marks the check down immediately. Your check’s own page shows the same snippets with its real URL filled in.

Built for the way scheduled jobs really behave

Schedules with breathing room

A simple interval or a full cron expression in any timezone, plus a grace period that tells a slow job from a missing one. “Late” is a warning; “down” is an alert.

Start, success and failure

Signal when a run begins to record its duration, and report failures the moment they happen instead of waiting for a deadline to pass.

History you can read

Recent runs as a row of coloured bars, a log of every ping with its details (including any output you send in the request body), and an uptime chart you can zoom into.

Monitoring the Laravel scheduler

Using Laravel? Every check page generates the scheduler code for you, on that check’s own schedule, so reporting a command takes three chained methods.

Schedule::command('backup:run') ->daily() ->pingBefore('https://pingvella.com/ping/your-check-uuid/start') ->thenPing('https://pingvella.com/ping/your-check-uuid') ->pingOnFailure('https://pingvella.com/ping/your-check-uuid/fail');

There’s a one-line heartbeat variant too, which tells you the scheduler itself is running, and a note on the single cron entry that keeps it alive on your server.

Questions about cron monitoring

What is heartbeat monitoring?

Your job sends a check-in on its expected schedule. If the check-in doesn’t arrive within the grace period, Pingvella flags the job as down and notifies you. It catches the failures that make no noise: a cron job that never started, a server that was switched off, a backup that quietly stopped.

How do I check in from a job?

Request your check’s unique URL when the job finishes, with curl, wget or any HTTP client. Append /start at the beginning of a run to measure its duration, or /fail to report a failure immediately.

What is the difference between late and down?

A late check has passed its expected time but is still within its grace period. A down check has passed that window, or reported a failure. Alerts are sent when a check goes down, and again when it recovers.

What if my job runs but fails?

Report it. Request your check’s /fail URL, or end the URL with the job’s exit status (/$? in a shell script), and Pingvella marks the check down straight away instead of waiting for the deadline to pass.

Does it work with the Laravel scheduler?

Yes. Each check page shows ready-made Laravel scheduler code on the check’s own schedule, using pingBefore, thenPing and pingOnFailure, plus a heartbeat that tells you the scheduler itself is running.

More answers on the FAQ page

Start in a couple of minutes

Give your jobs a voice.

Create a free account