didrun · checked

Why didn't my cron job run?

Work through it in order. First, is the cron daemon running? Then, did its log record starting your job? If it did, the job ran and failed. Check the crontab it is in, any % signs, and cron's short PATH. If the job is a GitHub Actions schedule rather than a crontab, GitHub keeps the record: npx --allow-git=root github:agentwares/didrun lists every run that came late or never.

A crontab on a server, step by step

StepHow to checkWhat it tells you
Is cron running?systemctl status cron on Debian and Ubuntu, systemctl status crond on Fedora and RHEL.If it is stopped, nothing in any crontab runs. A machine that was off or asleep at the time does not run the job later: cron runs what is due now, not what it missed.
Did it start the job?journalctl -u cron --since today (or -u crond), or grep CRON /var/log/syslog.A line with your command means cron started it, and the job itself failed. No line means cron never started it: check the schedule and the crontab.
Whose crontab, and is the line valid?crontab -l as the user you expect; sudo crontab -l -u name; files in /etc/cron.d carry a user field.A % in the command must be written \%, or everything after it becomes the command's input.
Does it work in cron's environment?Cron runs the command with /bin/sh and a short PATH, not your login shell.Use full paths, or set PATH= at the top of the crontab. A script that works in your terminal can fail under cron for this reason alone.
Where did its output go?Mailed to the crontab's owner, or to MAILTO, on the machine itself.Redirect it while you debug: … >> /tmp/job.log 2>&1.
Which time zone?The system's, unless the crontab sets CRON_TZ.timedatectl shows it. A job in the hour skipped by a clock change runs at once; a repeated hour does not run it twice.

A GitHub Actions schedule

A cron: line under on.schedule in a workflow is run by GitHub, not by a cron daemon, and the causes are different. GitHub delays scheduled runs under load and drops some. It runs a schedule only from the default branch. In a public repo it turns schedules off after 60 days without activity. The details, and how to check each, are on Why isn't my GitHub Actions schedule running?

Knowing when a crontab job did not run

The check above is by hand, after you notice. Being told when a crontab job misses its time takes something outside the machine. The job pings a URL each time it runs, and a watcher alerts you when a ping does not arrive. That watch is described below, and it is not built yet.

Check a repo

If your schedule is a GitHub Actions workflow, in a clone of the repo:

$ npx --allow-git=root github:agentwares/didrun

Run it in a clone, or name the repo. It reads GitHub's own record with your token (GITHUB_TOKEN, GH_TOKEN or the GitHub CLI's login), and with none it reads public repos. Its only requests are GETs to GitHub's API; the token is never printed or stored. No account, no change to your repo. Free and MIT licensed.

An hourly watch for scheduled runs is not built.

didrun tells you what happened when you ask. A watch would ask for you every hour, from outside GitHub's scheduler, and email you when a scheduled run is late, missed, or green with nothing done, with no change to your repo. It does not exist yet: agentcheck's free hourly watch covers MCP servers only today.

I would pay for an hourly watch of scheduled runs

The click is counted, and nothing else is sent: no form, no email, no cookie. There is no price yet and nothing is charged.

Sources

  • crontab(5), cronie — read 9 October 2026: an unescaped % becomes a newline and the rest goes to standard input; SHELL is /bin/sh; CRON_TZ; MAILTO and mail to the crontab's owner
  • cron(8), cronie — read 9 October 2026: crontabs checked every minute; jobs in an hour skipped by a clock change run at once, and a repeated hour does not run them twice
  • GitHub Docs: Events that trigger workflows, schedule — read 9 October 2026: scheduled runs delayed or dropped under load, and disabled after 60 days without activity in a public repository