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.