CronDrive
Guides

How to list the cron jobs on Linux, for every user

Updated 16 October 2026

The jobs of a server can be in several places: each user’s crontab, the system crontab, /etc/cron.d/, the /etc/cron.daily/ directories and, more and more, systemd timers. To review the tasks scheduled with cron and systemd on a server, check each one.

Your crontab

crontab -l

If you have none, it says no crontab for and your user. To edit it, crontab -e.

The crontab of another user, or of all of them

sudo crontab -l -u www-data

To go through the users that the system knows, as root:

sudo sh -c 'for user in $(getent passwd | cut -d: -f1); do
  crontab -l -u "$user" 2>/dev/null | grep -v "^\s*#" | sed "s/^/$user: /"
done'

Each line comes with the name of its user, and the comments are left out. getent passwd lists the local accounts and those of the other sources the system uses, though some, like an LDAP directory, may not list all of their users.

The crontabs are kept as one file per user in /var/spool/cron/crontabs/ on Debian and Ubuntu, and in /var/spool/cron/ on RHEL, Fedora and Rocky. To change them, use crontab -e -u <user>, not those files.

The system crontab and /etc/cron.d

cat /etc/crontab
ls /etc/cron.d/
cat /etc/cron.d/*

Their lines have one more field, with the user that runs the command, after the schedule. Packages often install their jobs in /etc/cron.d/.

/etc/cron.hourly, daily, weekly and monthly

The scripts in these directories have no schedule of their own: /etc/crontab, or anacron, runs them all with run-parts.

ls /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
run-parts --test /etc/cron.daily     # Debian, Ubuntu: the ones it would run

run-parts --test leaves out the files it would ignore, like those with a dot in their name.

systemd timers

Many distributions now schedule their jobs with systemd timers instead of cron. To see them all, with their next and last run:

systemctl list-timers --all

Those are the system’s. Each user can also have their own, which this command shows for the current user:

systemctl --user list-timers --all

Decide which ones to watch

With the list in hand, the jobs to watch are the ones whose failure you would notice late: backups, imports, renewals, reports. An AI agent with access to your server, like Claude Code, can read the crontab and use CronDrive’s MCP server to create a monitor for each line; the steps are in the docs.

CronDrive emails you, or posts to Slack, when a job with this schedule fails, or doesn't start or finish on time. Free for up to 15 jobs.

What you'd see with this schedule

An example with the last runs of this schedule and made-up results: one failed and one didn't run.

Times in UTC.

Due
Thu 15 Oct, 03:00 On time Started 03:00, finished 03:13, took 13 min.
Wed 14 Oct, 03:00 Didn't run Alerts sent at 03:05 and 03:30.
Tue 13 Oct, 03:00 On time Started 03:00, finished 03:14, took 14 min.
Mon 12 Oct, 03:00 Failed with code 1 Alert sent at 03:04. Started 03:00, finished 03:04, took 4 min.
Sun 11 Oct, 03:00 On time Started 03:00, finished 03:13, took 13 min.
Sat 10 Oct, 03:00 On time Started 03:00, finished 03:14, took 14 min.

The alert of the failed run

Email from CronDrive, Mon 12 Oct, 03:04

Failed (exit code 1): "Your job"

The job "Your job" failed with exit code 1.

If you connect Slack, the same message goes to your channel.

The change in your crontab

0 3 * * * curl -fsS -m 10 https://job.crondrive.com/uG2Exw/start/$$; /path/to/job.sh; curl -fsS -m 10 https://job.crondrive.com/uG2Exw/end/$?/$$

Two calls around your command, in the same line. Your job's line comes with its own token.

Monitor this schedule