Cron jobs for AI agents and LLM pipelines

Run agents, batch inference, and embedding refreshes on a schedule — and know within minutes when a run fails, hangs on a stuck API call, or quietly produces nothing.

The problem

AI workloads are moving onto schedules — a nightly agent that compiles a digest, an hourly embedding refresh, batch classification over yesterday's tickets. They inherit every classic cron failure and add their own: rate limits, hung LLM calls that never time out, a model ID deprecated by a provider update, an agent loop that swallows a tool error and exits 0 having done nothing. And nobody is watching the output — running unattended was the whole point.

How SteadyCron solves it

  1. 1 Trigger the workload with an HTTP job — SteadyCron calls your endpoint on schedule, with retries, backoff, and a timeout — or keep your existing cron and add a heartbeat.
  2. 2 Ping /start when the run begins and /success when it completes, so a run stuck on a hung LLM call shows up as overdue instead of as silence.
  3. 3 Include a short payload — items processed, token spend, the model used — for context in the activity feed.
  4. 4 Alert on missed, failed, or overlong runs, with consecutive-failure thresholds so one rate-limit blip doesn't page anyone.
TOKEN=<your-ping-token>
curl -fsS https://ping.steadycron.com/$TOKEN/start
n=$(python run_agent.py --task nightly-digest) \
  && curl -fsS --data "processed=$n" https://ping.steadycron.com/$TOKEN \
  || curl -fsS https://ping.steadycron.com/$TOKEN/fail
app.steadycron.com/jobs

Jobs

New job
Search jobs…
All HTTP Heartbeat
Status Group: env
env:prod 5 jobs 1 failing
weekly-digest-email HTTP 0 9 * * 1 in 2 days 3 days ago
nightly-db-backup Heartbeat 0 2 * * * in 19 h 5 h ago
stripe-reconciliation HTTP 0 */4 * * * in 38 min 3 h ago
cache-warmup HTTP */15 * * * * in 11 min now
search-index-sync Heartbeat */30 * * * * in 6 min 24 min ago
env:dev 3 jobs
seed-test-data HTTP 0 4 * * * in 14 h 10 h ago
preview-env-cleanup Heartbeat 0 */6 * * * in 2 h 4 h ago
trial-expiry-sweep HTTP 0 6 * * * yesterday

Every job's status, schedule, and last run — at a glance.

Exit code 0 is not a result

Agent frameworks are built to keep going: a tool call fails, the model apologizes and moves on, and the process exits cleanly with nothing written. Don’t ping success because the process ended — ping it after checking that the outcome exists (the digest was sent, the rows were embedded, the output file is non-empty), and ping /fail yourself when it doesn’t. The heartbeat check then alerts on what actually matters: no valid result within the expected window, whatever the cause.

Failure modes plain cron never had

  • Rate limits and spend caps: a 429 storm or an exhausted monthly budget ends tonight’s run early — and tomorrow’s too. Consecutive-failure thresholds separate the transient blip from the pipeline that stays broken.
  • Hung calls: an LLM request without a timeout can idle a run forever. Because /start arrived and /success never did, the run shows up as overdue after the grace period — instead of hanging unnoticed for days.
  • Model drift: a deprecated model ID or a changed response shape breaks your parsing on the provider’s timeline, not your deploy timeline. The per-run log — status, payload, duration — shows exactly which night it started.

A good fit for

  • Nightly agent runs: digests, ticket triage, report generation, scheduled scrapes that feed a model.
  • RAG maintenance: embedding refreshes and index rebuilds, where staleness is invisible until answer quality degrades.
  • Batch inference: classification, enrichment, or summarization jobs over yesterday’s data.

Debugging a run that already went quiet? See Scheduled AI agent not running for a step-by-step diagnosis, or Dead man’s switch for AI agents for the pattern behind it.

Related documentation

Stop finding out the hard way

Start on the free tier — no credit card required.

Start free