
Cron 是一种基于时间的调度器,会按设定的间隔运行命令和脚本。这些被安排的任务称为 cron 任务(cron job),它们可以每分钟、每小时、每天、每周、每月运行,也可以按自定义计划运行。
Cron 任务常用于系统维护。例如,你可以安排数据库备份、软件包更新、缓存清理以及发送报表邮件。
本指南讲解如何查看并列出用户的 cron 任务、系统级的 cron 任务,以及 systemd 定时器。
要读懂一条已有 cron 行的含义,可把它粘贴进交互式 crontab 生成器,获取自然语言解释。
快速参考
如需可打印的快速参考,请参阅 crontab 速查表。
| 任务 | 命令 |
|---|---|
| 列出当前用户的 cron 任务 | crontab -l |
| 列出另一个用户的 cron 任务 | sudo crontab -u USER -l |
| 列出每个用户的 cron 任务 | Use the spool-based script below |
| 列出拥有 crontab 的用户(Debian/Ubuntu) | sudo ls -1 /var/spool/cron/crontabs |
| 列出拥有 crontab 的用户(RHEL/Fedora) | sudo ls -1 /var/spool/cron |
| 查看系统级 cron 文件 | cat /etc/crontab /etc/cron.d/* |
| 列出所有 cron.* 目录脚本 | ls -l /etc/cron.{hourly,daily,weekly,monthly}/ |
| 列出 systemd 定时器 | systemctl list-timers |
| 列出按用户的 systemd 定时器 | systemctl --user list-timers |
列出用户的 Cron 任务
用户的 crontab 文件以用户名命名,其存放位置因操作系统而异。在基于 Red Hat 的发行版中,crontab 文件保存在 /var/spool/cron 目录;而在 Debian 和 Ubuntu 上,文件保存在 /var/spool/cron/crontabs 目录。
要查看或列出当前登录用户的所有 cron 任务,请使用 crontab 命令:
crontab -l
如果用户已设置了 cron 任务,用户 crontab 的内容会显示在屏幕上。否则,命令会打印 no crontab for
要列出其他用户的 cron 任务,可使用 -u 选项在命令末尾指定用户名。例如,要列出名为 “mark” 的用户的 cron 任务,可以使用:
sudo crontab -u mark -l
每个用户的 crontab 文件权限为 600,且归该用户所有。只有 root 以及拥有 sudo 权限的用户才能查看其他用户的 cron 任务。
要找出哪些用户创建了 cron 任务,请以 root 或 sudo 用户身份列出 spool 目录的内容。
在 Debian、Ubuntu 及其衍生版上,运行:
sudo ls -1 /var/spool/cron/crontabs
在 Fedora、RHEL 及其衍生版上,运行:
sudo ls -1 /var/spool/cron
输出大致如下:
root
mark
列出所有用户的 Cron 任务
spool 目录列表只能告诉你谁拥有一个 crontab,却看不到其中的内容。要一次性打印出每一个已保存的用户 crontab,可以选定该发行版使用的 spool 目录,并遍历其中存储的文件:
spool
=
/var/spool/cron
[
-d /var/spool/cron/crontabs
]
&&
spool
=
/var/spool/cron/crontabs
sudo sh -c
'
for file in "$1"/*; do
[ -f "$file" ] || continue
user=${file##*/}
printf "# %s\n" "$user"
crontab -u "$user" -l
done
'
sh
"
$spool
"
该测试会在 Debian 和 Ubuntu 上选择 /var/spool/cron/crontabs,在 Fedora 和 RHEL 上选择 /var/spool/cron。root shell 可以读取受保护的目录,而每个标题都标明了其后 crontab 的所有者:
# root
0 3 * * * /usr/local/bin/backup.sh
# mark
*/15 * * * * /home/mark/bin/sync-photos
此示例只出现了两个已保存 crontab 的用户。这仅涵盖用户 crontab,因此系统级计划仍需要下一节描述的文件。
列出系统级 Cron 任务
/etc/crontab 以及 /etc/cron.d 目录中的文件是系统级 crontab 文件,只能由系统管理员编辑。
可使用 cat、less 或任意文本编辑器查看这些文件的内容:
cat /etc/crontab /etc/cron.d/*
在大多数 Linux 发行版中,你还可以把脚本放进 /etc/cron.{hourly,daily,weekly,monthly} 这几个目录,这些脚本会每小时/每天/每周/每月执行一次。
这些目录中的每一个脚本都必须拥有可执行权限,否则该 cron 任务不会被执行。
例如,要查看所有每周执行的 cron 任务,可以输入:
ls -l /etc/cron.weekly/
-rwxr-xr-x 1 root root 813 Mar 21 09:14 man-db
如果输出为空,说明没有每周执行的 cron 任务。
要一次性检查所有时间间隔,可以把这四个目录都传给 ls:
ls -l /etc/cron.
{
hourly,daily,weekly,monthly
}
/
/etc/cron.daily/:
total 16
-rwxr-xr-x 1 root root 1478 Mar 21 09:14 apt-compat
-rwxr-xr-x 1 root root 1235 Mar 21 09:14 dpkg
-rwxr-xr-x 1 root root 377 Mar 21 09:14 logrotate
-rwxr-xr-x 1 root root 539 Mar 21 09:14 man-db
/etc/cron.hourly/:
total 0
/etc/cron.monthly/:
total 0
/etc/cron.weekly/:
total 4
-rwxr-xr-x 1 root root 813 Mar 21 09:14 man-db
注意 ls 会按字母顺序对目录参数排序,因此列出的顺序是 daily、hourly、monthly、weekly,而不是我们输入的先后。输出会因发行版和已安装软件包而异。在当前的 Ubuntu 和 Debian 版本中,像 APT、logrotate 这样的软件包会在 systemd 定时器单元旁边安装兼容脚本。目录列表显示的是安装了哪些脚本,而不是当前生效的是哪种调度机制。
Systemd 定时器
systemd 定时器是以后缀 .timer 结尾的单元文件,可让你基于时间运行服务单元。
在使用 systemd 作为 init 系统的 Linux 发行版上,systemd 定时器常被用作标准 cron 守护进程的替代方案。
要查看本机所有处于活动状态的 systemd 定时器列表,运行以下命令:
systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2026-02-09 00:00:00 UTC 3h 12min left Sun 2026-02-08 00:00:00 UTC 20h ago logrotate.timer logrotate.service
Mon 2026-02-09 00:00:00 UTC 3h 12min left Sun 2026-02-08 00:00:00 UTC 20h ago man-db.timer man-db.service
Mon 2026-02-09 06:45:31 UTC 9h left Sun 2026-02-08 06:22:17 UTC 14h ago apt-daily.timer apt-daily.service
Mon 2026-02-09 06:53:04 UTC 10h left Sun 2026-02-08 06:41:39 UTC 14h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Mon 2026-02-09 20:48:56 UTC 24h left Sun 2026-02-08 20:48:56 UTC 3min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
要同时包含未激活的定时器,可以使用 --all 标志:
systemctl list-timers --all
这两条命令报告的是 systemd 的系统实例。定时器也可以按用户定义在 ~/.config/systemd/user 之下,而那些永远不会出现在系统列表中。要查看你当前登录账户所属的定时器,请加上 --user 标志:
systemctl --user list-timers
用户定时器只有在该用户处于活动会话期间才会运行,除非使用 loginctl enable-linger USER 为该账户启用了 lingering(持久化)。在一台无头机器上看似被跳过的计划任务,往往是一个未启用 lingering 的用户定时器。
故障排查
crontab -l 显示 no crontab for
sudo crontab -u USER -l 返回权限错误——请以 root 身份运行,或用一个拥有 sudo 权限的用户运行。同时确认目标用户在系统中确实存在。
脚本存在于 /etc/cron.weekly/ 却没有运行——请检查该脚本是否可执行(chmod +x /path/to/script),并且是否包含有效的 shebang 行。
任务已被列出却似乎从未运行——列出任务只能证明计划存在,并不代表 cron 已经执行过它。在 Debian 和 Ubuntu 上用 journalctl -u cron --since today 查看 cron 日志,在 Fedora、RHEL 及其衍生版上则用 journalctl -u crond --since today。关于使用 crontab 安排 cron 任务的指南会逐步讲解其余的失败原因。
常见问题
crontab -l 与 /etc/crontab 有什么区别?crontab -l 显示的是按用户划分的任务,而 /etc/crontab 是一个由管理员管理的系统级 crontab。
用户 crontab 存放在哪里?在 Debian/Ubuntu 上,它们位于 /var/spool/cron/crontabs;在 RHEL/Fedora 上,它们位于 /var/spool/cron。
应该用 cron 还是 systemd 定时器?两者都能用。systemd 定时器能更好地与现代 Linux 服务管理和日志系统集成,而 cron 依旧简单且被广泛使用。
结论
你可以用 crontab -l 列出按用户的 cron 任务,在 /etc/crontab 与 /etc/cron.d 中查看系统级计划,并用 systemctl list-timers 检查 systemd 定时器。