Five checks, in the order you usually need them: which jobs exist, whether cron itself is up, whether a job ran, what it printed, and whether it is running right now. Where Debian and Ubuntu differ from RHEL, Rocky, AlmaLinux and Fedora, the difference is one line below the command.
List the cron jobs
Your own crontab, then another user's (as root):
crontab -l
sudo crontab -l -u <user>
System jobs live outside any user's crontab:
cat /etc/crontab
ls /etc/cron.d /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
A directory that does not exist simply holds no jobs; on RHEL and Fedora the daily, weekly and monthly ones come with anacron.
To see which users have a crontab at all:
sudo ls /var/spool/cron/crontabs on Debian and Ubuntu,
sudo ls /var/spool/cron on RHEL and Fedora.
Many distributions now ship scheduled work as systemd timers, which no crontab lists. Show them with their last and next run:
systemctl list-timers --all
Check the cron daemon is running
systemctl status cron
On RHEL and Fedora the service is crond:
systemctl status crond. Look for
active (running); anything else means no job runs.
Check whether a job ran
Cron logs each job it starts. Read today's entries from the journal:
sudo journalctl -u cron --since today
On RHEL and Fedora use -u crond. Where rsyslog
is installed the same lines are also in a file:
grep CRON /var/log/syslog on Ubuntu,
sudo tail -n 50 /var/log/cron on RHEL, where the journal keeps
only the current boot by default. Debian 12 and later and Fedora keep
them in the journal only by default.
For a systemd timer, ask its service unit:
systemctl status backup.service shows the last run's result,
journalctl -u backup.service its output.
A cron log line says a job started. It does not say whether the job succeeded.
See what the job printed
Cron mails a job's output to the crontab's owner. On a server with no mail set up, that output is usually lost. Send it to a file instead, one the crontab's user can write:
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Check if a job is running right now
pgrep -af backup.sh
It prints the process ID and full command line of every
match, and nothing when no process matches. For a cron job you often see
two lines: the job and the sh -c that cron started it with.
The same command works on every distribution above.
These checks show the past
Every check above answers one question about one server, and only when you think to ask. None of them tells you that tonight's backup did not run: a job that never started leaves no log line to find.
A heartbeat
turns it around. The job checks in over HTTP on every run, an outside
service knows when the next check-in is due, and a missing one alerts
you. The cron job monitoring guide
shows the one-line curl for crontab and systemd timers;
WordPress sites have their own guide.
Know when a job does not run
Free for 20 monitors, no credit card. One
curl and you're covered.