Skip to content

How to List All Cron Jobs for All Users in Linux (crontab, cron.d and systemd Timers)

Updated 5 min read

Updated: 9 October 2026 · Applies to: cron 3.0pl1 on Debian 13 and Ubuntu 26.04, cronie 1.7.0 on AlmaLinux 10 and cronie 1.5.7 on Rocky Linux 9 (all tested); systemd timers on Debian 13

To list your own cron jobs, run crontab -l. To see another user's jobs, run sudo crontab -l -u USERNAME. To view cron jobs for all users, you need more than one command, because jobs live in four places: each user's crontab, /etc/crontab, the files in /etc/cron.d/ and the cron.hourly, daily, weekly and monthly folders. Many systems also schedule tasks with systemd timers. The steps below check every one of them.

1. List your own cron jobs

$ crontab -l
0 4 * * * /root/cleanup.sh

If you have none, it prints no crontab for USERNAME and exits with code 1. To change the list, use crontab -e.

2. Show the cron jobs of one user

$ sudo crontab -l -u bob
# nightly report
30 2 * * * /usr/local/bin/report.sh >/dev/null 2>&1

This needs root. The order of the options does not matter: crontab -u bob -l works too.

3. Show cron jobs for all users

This loop asks crontab for every account and puts the user name in front of each job, leaving out comment lines:

$ sudo bash -c 'for u in $(getent passwd | cut -d: -f1); do crontab -l -u "$u" 2>/dev/null | grep -v "^#" | sed "s/^/$u: /"; done'
root: 0 4 * * * /root/cleanup.sh
alice: */15 * * * * /home/alice/bin/backup.sh
bob: 30 2 * * * /usr/local/bin/report.sh >/dev/null 2>&1

getent passwd also includes users from LDAP or another directory, which a plain read of /etc/passwd would miss. The loop worked the same way on Debian 13, Ubuntu 26.04, AlmaLinux 10 and Rocky Linux 9.

A quicker way is to read the crontab files directly. They live in a different folder per distribution:

sudo grep -v '^#' /var/spool/cron/crontabs/*    # Debian, Ubuntu
sudo grep -v '^#' /var/spool/cron/*             # AlmaLinux, Rocky Linux, RHEL
/var/spool/cron/crontabs/alice:*/15 * * * * /home/alice/bin/backup.sh
/var/spool/cron/crontabs/bob:30 2 * * * /usr/local/bin/report.sh >/dev/null 2>&1
/var/spool/cron/crontabs/root:0 4 * * * /root/cleanup.sh

Only read these files. To change a job, use sudo crontab -e -u USERNAME, so cron notices the change and checks the syntax.

4. List the system-wide cron jobs

Jobs in /etc/crontab and /etc/cron.d/ have an extra field: the user the command runs as.

$ grep -v '^#' /etc/cron.d/*
/etc/cron.d/e2scrub_all:10 3 * * * root test -e /run/systemd/system || SERVICE_MODE=1 /sbin/e2scrub_all -A -r
/etc/cron.d/myapp:*/5 * * * * www-data /usr/bin/php /var/www/app/cron.php

(Shortened.) Then look at /etc/crontab. The two families use it differently:

  • Debian and Ubuntu: /etc/crontab runs the folders with run-parts, for example 17 * * * * root cd / && run-parts --report /etc/cron.hourly. The daily, weekly and monthly lines hand over to anacron when it is installed.
  • AlmaLinux, Rocky Linux and RHEL: /etc/crontab holds only comments. Hourly jobs start from /etc/cron.d/0hourly (01 * * * * root run-parts /etc/cron.hourly), and /etc/anacrontab runs the daily, weekly and monthly folders between 03:00 and 22:00 with a random delay.

5. Check the hourly, daily, weekly and monthly folders

ls /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly

Every executable script in these folders is a job. On Debian and Ubuntu, ask run-parts which scripts will really run:

$ run-parts --test /etc/cron.daily
/etc/cron.daily/apt-compat
/etc/cron.daily/backup
/etc/cron.daily/dpkg
/etc/cron.daily/exim4-base
/etc/cron.daily/logrotate
/etc/cron.daily/man-db

In that test, the folder also held backup.sh, which is missing from the list: Debian's run-parts skips file names with a dot, so name the script backup, not backup.sh. On AlmaLinux 10, run-parts --list /etc/cron.daily did include backup.sh.

6. List systemd timers

Many packages now schedule their work as systemd timers instead of cron jobs:

$ systemctl list-timers --all
NEXT                             LEFT LAST PASSED UNIT                         ACTIVATES
(timer lines omitted)

Each line shows when a timer runs next, when it last ran and the service it starts. On Debian 13 we saw, among others, apt-daily.timer, logrotate.timer, man-db.timer, dpkg-db-backup.timer and fstrim.timer.

7. One-off jobs and background jobs

  • at jobs: atq (or at -l) lists jobs queued with at. According to the at manual, root sees everybody's jobs and other users see only their own. Remove one with atrm NUMBER.
  • Shell jobs: jobs -l shows the commands running in the background of your current terminal (started with & or paused with Ctrl+Z). They are not scheduled jobs.

Check that a cron job ran

journalctl -u cron --since today     # Debian, Ubuntu
journalctl -u crond --since today    # AlmaLinux, Rocky Linux
sudo grep CROND /var/log/cron        # AlmaLinux, Rocky Linux

Since Debian 12, rsyslog is no longer installed by default, so /var/log/syslog may not exist; the journal always works.

Cron jobs on shared hosting

On cPanel hosting you cannot run crontab for other users. Open cPanel › Advanced › Cron Jobs: your jobs are in the Current Cron Jobs table. On Virtualmin, according to the Virtualmin documentation, the jobs are under Webmin › System › Scheduled Cron Jobs. Our Acceptable Use Policy allows cron on shared and reseller hosting, with each job running no more often than every 15 minutes.

Related: how to read crontab syntax, how to add jobs to cron, how to schedule jobs with anacron and how to create a cron job in cPanel.

Related services

KVM VPS hosting

NVMe SSD and full root access, with Free Basic Managed Support.

Unmanaged dedicated servers

full root access and free IPMI KVM, with Free Basic Managed Support.

Linux server management

hardening, patching, monitoring and automation for Ubuntu, Debian, RHEL and AlmaLinux.

Was this answer helpful?

Still stuck? Open a ticket