← All guides

How to List All Cron Jobs in Linux (Every User & Timer)

Updated:
crontab -l                      # your own cron jobs
sudo crontab -l -u www-data     # another user's cron jobs
cat /etc/crontab                # system-wide crontab
ls -l /etc/cron.d/              # package and admin job files
systemctl list-timers --all     # systemd timers (the "other" cron)

crontab -l is what most people try first, and it is the reason jobs go missing: it only shows the current user's crontab. A server usually has jobs in five places, and on modern distributions many scheduled tasks are systemd timers that no crontab lists at all.

To check whether those jobs actually ran, see cron job execution history; to get alerted when one does not, see cron job monitoring.

Where Cron Jobs Live

Location Who edits it Format List it with
Per-user crontabs crontab -e m h dom mon dow command sudo crontab -l -u <user>
/etc/crontab root, by hand adds a user field cat /etc/crontab
/etc/cron.d/* packages, config management adds a user field cat /etc/cron.d/*
/etc/cron.hourly/, daily/, weekly/, monthly/ packages executable scripts, no schedule line ls -l /etc/cron.{hourly,daily,weekly,monthly}
systemd timers units in /etc/systemd/system, /lib/systemd/system .timer + .service systemctl list-timers --all

Per-user crontab files are stored in /var/spool/cron/crontabs/<user> on Debian/Ubuntu and /var/spool/cron/<user> on RHEL, Rocky, Alma and Fedora. Read them through crontab -l -u rather than editing the files directly.

List Cron Jobs for All Users

# Every user in /etc/passwd that has a crontab
for u in $(cut -d: -f1 /etc/passwd); do
  jobs=$(sudo crontab -l -u "$u" 2>/dev/null | grep -Ev '^\s*(#|$)')
  [ -n "$jobs" ] && printf '### %s\n%s\n\n' "$u" "$jobs"
done

The grep drops comments and blank lines, so users without real jobs are skipped. Users that come from LDAP/SSO are not in /etc/passwd; in that case list the spool directory instead:

sudo ls -l /var/spool/cron/crontabs/   # Debian / Ubuntu
sudo ls -l /var/spool/cron/            # RHEL family

One Script That Prints Everything

#!/usr/bin/env bash
# list-all-cron.sh - print every scheduled job on this host (run as root)
echo "===== user crontabs ====="
for u in $(cut -d: -f1 /etc/passwd); do
  out=$(crontab -l -u "$u" 2>/dev/null | grep -Ev '^\s*(#|$)')
  [ -n "$out" ] && echo "--- $u" && echo "$out"
done

echo; echo "===== /etc/crontab ====="
grep -Ev '^\s*(#|$)' /etc/crontab 2>/dev/null

echo; echo "===== /etc/cron.d ====="
for f in /etc/cron.d/*; do
  [ -f "$f" ] || continue
  echo "--- $f"; grep -Ev '^\s*(#|$)' "$f"
done

echo; echo "===== periodic directories ====="
for d in hourly daily weekly monthly; do
  echo "--- cron.$d: $(ls /etc/cron.$d 2>/dev/null | tr '\n' ' ')"
done

echo; echo "===== anacron ====="
grep -Ev '^\s*(#|$)' /etc/anacrontab 2>/dev/null

echo; echo "===== systemd timers ====="
systemctl list-timers --all --no-pager

Run it with sudo bash list-all-cron.sh and keep the output when you take over a server - it is the fastest inventory of everything that runs on its own.

systemd Timers: Jobs crontab -l Never Shows

Log rotation, apt updates, certbot renewals, fstrim and many application jobs run as systemd timers on current Debian, Ubuntu and RHEL releases.

# All timers with last and next run
systemctl list-timers --all

# What a timer actually runs
systemctl cat certbot.timer certbot.service

# Last runs and output of the job
journalctl -u certbot.service -n 50 --no-pager

The NEXT and LAST columns answer "when does it run" without decoding a cron expression.

at Jobs and Anacron

  • One-off jobs scheduled with at are listed with atq (and shown in full with at -c <job-number>).
  • Anacron (/etc/anacrontab) runs the cron.daily/weekly/monthly scripts on machines that are not always on, such as laptops and some VMs; its timestamps are in /var/spool/anacron/.

Cron Logs: Did the Job Run?

Listing a job proves it is scheduled, not that it ran.

# Debian / Ubuntu
grep CRON /var/log/syslog | tail -n 50
journalctl -u cron --since today

# RHEL / Rocky / Alma / Fedora
sudo tail -n 50 /var/log/cron
journalctl -u crond --since today

The log shows that cron started a command; it does not show whether the command succeeded. Redirect each job's output to a log file (>> /var/log/myjob.log 2>&1) or use a monitor that checks the exit code.

Monitor Your Jobs With Zuzia

Knowing where your cron jobs are is step one; noticing when one silently stops is the hard part. With the Zuzia agent, you can move a job into a Zuzia scheduled task: Zuzia runs the command on your schedule and keeps an execution log of every run with an AI summary of what it produced. You change the command, frequency or target host from the panel instead of editing crontab over SSH - and there is no separate heartbeat URL to maintain.

FAQ

How do I list all cron jobs in Linux?

Run sudo crontab -l -u <user> for each user, then check /etc/crontab, /etc/cron.d/, the /etc/cron.hourly|daily|weekly|monthly directories and systemctl list-timers --all. The script above does all of it in one go.

How do I view another user's crontab?

sudo crontab -l -u username. Without root you can only read your own crontab.

Where are crontab files stored?

Per-user crontabs are in /var/spool/cron/crontabs/ (Debian/Ubuntu) or /var/spool/cron/ (RHEL family). System-wide jobs are in /etc/crontab and /etc/cron.d/.

Why does crontab -l say "no crontab for user"?

That user has no personal crontab. Jobs may still exist in /etc/crontab, /etc/cron.d/, the periodic directories or as systemd timers.

How do I check the cron log?

On Debian/Ubuntu: grep CRON /var/log/syslog or journalctl -u cron. On RHEL-based systems: /var/log/cron or journalctl -u crond.

We use cookies to ensure the proper functioning of our website.