All posts

Healthcheck Systems Explained: Pull, Push, and Heartbeat

August 30, 2026

Most teams say "healthcheck" and picture one thing: a /health endpoint that returns a 200. That's a single check, not a system. A real healthcheck system continuously verifies that a process is alive, ready, or has actually completed what it was supposed to do — and there are three fundamentally different architectures for doing that, each catching failure modes the others miss entirely.

Teams routinely assume one architecture covers everything. It doesn't. If you run scheduled or cron jobs, the healthcheck setup protecting your web services is very likely blind to a job that silently stopped running weeks ago. Let's define the category properly, then narrow in on where cron jobs actually fit.

What Is a Healthcheck System, Exactly?

A healthcheck system is any mechanism that continuously verifies whether something is functioning correctly — a running process, a container, a service, or a scheduled task — and raises an alert when it isn't. The key word is system: it implies an ongoing verification loop with expectations, thresholds, and alerting logic, not a single endpoint you curl once and forget.

It answers three distinct questions, depending on what you're monitoring: Is the process alive? Is it ready to accept traffic? And, for scheduled work, did it actually run and finish? Conflating these leads teams to think their existing healthcheck systems provide coverage they don't. The three architectures below each answer a different subset of those questions.

The Three Core Architectures: Pull, Push, and Heartbeat

Pull-based checks work by having an external system reach into your service and ask "are you okay?" Kubernetes liveness and readiness probes are the canonical example — the kubelet periodically hits an endpoint, runs a command, or opens a socket, and acts on the response. Traditional uptime monitoring works the same way: a monitor pings your URL on an interval and flags it down if it doesn't respond. Pull-based systems require something to be reachable and interrogable at the moment of checking.

Push-based checks invert that relationship: your process reports its own status outward, typically at the end of a task, rather than waiting to be asked. This is useful when the thing you care about isn't continuously running or listening on a port.

Heartbeat monitoring, sometimes called dead-man's-switch monitoring, is a specific flavor of push-based checking built around absence rather than presence. Instead of confirming a bad response, it confirms the total lack of an expected one. Your job pings in when it starts and finishes; if that ping doesn't arrive within an expected window, the system assumes failure and alerts. The term "dead man's switch" comes from mechanical safety devices that trigger unless someone actively releases them — silence itself is the failure signal.

For a deeper look at how the pull/uptime pattern behaves in practice, see this breakdown of what internet uptime monitoring actually sees — and doesn't.

Where Container and App-Level Probes Stop

Kubernetes offers three probe types — liveness, readiness, and startup — and it's worth being precise about what each checks. Per the official Kubernetes documentation, a liveness probe determines whether a container should be restarted because it's stuck or deadlocked; a readiness probe determines whether a container should receive traffic; a startup probe gives slow-starting containers time before liveness checks kick in. These serve orchestration decisions, not task completion — they tell Kubernetes whether to restart or route to a pod, nothing more.

Docker's HEALTHCHECK instruction operates on the same principle at the container level: it runs a command inside the container on an interval and marks the container unhealthy if that command fails repeatedly. As Spacelift's comparison of Kubernetes health checks points out, both mechanisms exist to answer "is this container in a good state," not "did this container do its job."

That distinction is the entire point. A container healthcheck confirms a process is responsive right now. It says nothing about whether a batch job it ran an hour ago completed successfully, updated the right rows, or even started at all.

The Blind Spot: Why These Systems Miss Cron and Scheduled Jobs

Pull-based probes and container healthchecks share one structural requirement: something has to be running and reachable at the moment of the check. Cron jobs and scheduled tasks break that assumption by design. Between runs, there's no process to probe, no port to hit, no container to interrogate — the job is simply absent, and absence is exactly what pull-based systems can't evaluate.

This is the core gap behind silent cron failure. A cron entry gets deleted during a deploy, a scheduler container crashes, a dependency times out and the script exits before completing its work — and every liveness probe, readiness probe, and uptime monitor on your infrastructure stays green throughout, because none of them were ever watching the job itself; they were watching whether something else was still alive. For a fuller picture of why general observability stacks fall short here, see what DevOps observability tools miss about cron jobs, and for the underlying failure patterns, why cron jobs fail in the first place.

A healthcheck system for cron jobs has to flip the model: instead of asking "are you there," it has to notice when an expected report never arrives. That's the heartbeat pattern, and it's the only one of the three architectures built to catch a job that never started or never finished.

Anatomy of a Resilient Healthcheck System

Regardless of which pattern you choose, a resilient healthcheck system needs a few structural pieces in place:

  • A defined schedule or interval — the system needs to know what "on time" means before it can flag what's late.
  • Grace period alerting — some tolerance around the expected time window, so a job running two minutes long doesn't trigger a false alarm every run.
  • Escalating alerts — a single notification is easy to miss; escalation (retry, then a second channel, then a person) reduces the odds a real failure goes unnoticed.
  • Run history — a log of past check-ins or probe results, so you can debug patterns like "this job has been running 40% slower for a week" rather than reacting to isolated incidents.

Grace period monitoring in particular separates a usable heartbeat setup from a noisy one — too tight, and you get alert fatigue; too loose, and failures sit undetected for hours.

Choosing the Right Pattern for Your System

A simple framework: if you're monitoring a long-running service that's always listening, pull-based checks fit naturally — that's what uptime monitors and load balancer health checks are for. If you're monitoring a container's internal process state, Kubernetes probes or Docker HEALTHCHECK are the right tool for orchestration decisions. If you're monitoring anything that runs on a schedule and then goes quiet — cron jobs, scheduled HTTP calls, batch scripts, backup tasks — you need the push/heartbeat pattern, because it's the only one designed to alert on absence rather than bad response.

Choosing a healthcheck system isn't about picking one architecture and applying it everywhere; it's about matching the pattern to how the thing you're monitoring actually behaves. Once you've identified that your gap is specifically cron job monitoring, the practical next step is a buyer's guide — see what a cron monitor is and how to choose one.

If that gap is "did my scheduled job run and finish," you don't need to build a heartbeat system from scratch. Cronevra provides push-based monitoring purpose-built for cron and scheduled HTTP jobs, with grace periods and escalating failure alerts already configured — check pricing to get started.

Frequently Asked Questions

What's the difference between a healthcheck and a heartbeat monitor?

A healthcheck typically pulls status from a process by asking it a question right now, while a heartbeat monitor waits for the process to push a signal in on its own schedule. Heartbeat monitoring flags failure when an expected signal is missing, whereas a standard healthcheck flags failure when a response is bad. That distinction is why heartbeats catch processes that go silent entirely, not just ones that respond poorly.

Do Kubernetes liveness probes monitor my cron jobs too?

No, liveness probes only monitor the container process they're attached to, checking whether it should be restarted. They don't track whether a scheduled task inside that container actually ran, finished, or produced correct output, since a cron job can fail or never execute while the container itself stays perfectly healthy.

What is a dead man's switch in software monitoring?

A dead man's switch is a monitoring pattern that alerts when an expected check-in fails to arrive, rather than when a bad response is received. It's named after mechanical safety devices that activate unless manually released, and in software it's the same underlying mechanism as heartbeat monitoring for cron and scheduled jobs.

How often should a healthcheck system check in or ping?

It should match the job's actual run frequency plus a reasonable grace period — a job that runs hourly might get a 10-15 minute grace window before alerting. Setting the interval too tight causes false alarms from normal runtime variance; setting it too loose delays detection of real failures.

Can uptime monitoring replace a dedicated cron job healthcheck?

No, because uptime monitoring pings a URL to confirm something responds, which only works for continuously available endpoints. Cron jobs aren't reachable between runs, so there's nothing for an uptime monitor to ping, meaning a job that silently stops running produces no downtime signal at all.

Is a single /health endpoint enough to call something a healthcheck system?

No, a single endpoint is one data point, not a system — a healthcheck system implies ongoing verification with scheduling logic, thresholds, grace periods, and alerting built around it. A /health route that returns 200 tells you the app is up at that instant; it says nothing about scheduled tasks, historical reliability, or escalation when something actually breaks.