Cron job monitoring that notices when a job did not run

A cron job that silently stops is worse than one that fails loudly. Each Asniher heartbeat monitor has a unique URL your job calls when it runs. If the ping is late, missing or reports a failure, you are alerted with the exit status and the end of the job's output.

What you get with cron job monitoring

Cron schedules with time zones

Paste the five-field expression from your crontab and pick the server's time zone. Daylight saving time is handled for you. Fixed periods of up to 30 days work too.

Start, fail and exit-status signals

Ping /start to time a run and catch jobs that hang, /fail to alert right away, or append the exit status. Warning exit codes flag a run that needs a look without opening an incident.

Why it failed, in the alert

POST the job output with the ping and the last 10 KB is kept in the ping log. Failure alerts show the exit status and the last 1,500 characters; webhooks receive the full output.

One outage, one alert

Make a job depend on the API it calls. While the API is down, the job's alerts are held back, so one outage does not page you once per job.

Set it up in a few minutes

  1. Step 1

    Create a heartbeat monitor

    Name it after the job, paste its cron expression and time zone, and set a grace period a little longer than its slowest normal run.

  2. Step 2

    Add the ping to your job

    Chain a curl call after the command, or put the asniher-run wrapper in front of it. The wrapper needs only sh and curl, and your job still runs if Asniher cannot be reached.

  3. Step 3

    Connect an alert channel

    Alerts go to your account email by default. Add Slack, Discord, Telegram or a webhook for the team.

  4. Step 4

    Let it run once

    The ping log lists each run with its signal, exit status, run time and output, so you can confirm the setup.

A nightly backup at 02:30, either wrapped or with curl only:
30 2 * * * asniher-run -u https://app.asniher.com/api/heartbeat/<token> -- /opt/scripts/backup.sh

30 2 * * * /opt/scripts/backup.sh && curl -fsS -m 10 --retry 3 https://app.asniher.com/api/heartbeat/<token> > /dev/null

Limits by plan

Every plan includes false-alarm protection, incident history and the status badge. Annual billing gives two months free.

Free · $0/mo

Heartbeat monitors
20
Shortest fixed period
5 minutes
Alert channels
Email, Slack, Discord

Pro · $2.99/mo

Heartbeat monitors
100
Shortest fixed period
1 minute
Alert channels
Email, Slack, Discord, Telegram, Webhook

Team · $9.99/mo

Heartbeat monitors
500
Shortest fixed period
30 seconds
Alert channels
Email, Slack, Discord, Telegram, Webhook

Good to know

  • Heartbeats have their own allowance and never use up your uptime monitors.
  • Grace periods go up to 7 days. Fixed periods go up to 30 days.
  • Pings are kept for 30 days and the ping log shows the last 100. Each URL accepts up to 60 pings per minute.
  • A missed ping opens an incident as soon as the deadline passes, without a re-check, so use the grace period for normal variance in run time.
  • systemd OnCalendar schedules are not supported; use a cron expression or a fixed period.
  • Anyone with the ping URL can send pings. Treat it like a password.

Common questions

Do heartbeats count against my uptime monitors?

No. Heartbeats have their own allowance: 20 on Free, 100 on Pro and 500 on Team.

Can I monitor scheduled GitHub Actions workflows?

Yes. Ping the heartbeat URL in a final step, or run the job through asniher-run. GitHub can start scheduled workflows late, so leave at least 30 minutes of grace.

Can I move my checks from Healthchecks.io?

Yes. Monitors → Import takes a read-only API key and creates heartbeats with the same names, schedules, time zones and grace periods. The ping URLs change, so you can run both while you switch over.

Start monitoring in under five minutes

Free plan includes 5 monitors, 20 cron job heartbeats, 5-minute checks and a public status page. No card required.