用户的定时任务(Crontab)存储在哪里?

自从我升级了用户的crontab之后,它就被清空了。这已经不是今年第一次发生这种情况了,每次都需要费力地恢复它。
我希望能够备份我的用户的crontab,但为此我需要知道它存储在哪里。

6希望有人能够给出为什么被抹掉的原因。 - Walter Tross
1@WalterTross 是的,这真的很烦人。我猜测这可能是更新“cron”软件包的副作用,但我同意 - 这不应该发生。 - Oli
哦,我不知道用户的cron会在cron软件包升级时被清除! - pl1nk
@pl1nk 我不知道是什么在抹掉它,但这种情况一直发生。我猜是机器里的幽灵。 - Oli
用户表存储在临时区域 /var/spool/cron/crontabs/$USER 上,因此它们可能会在下次启动或升级时被删除。 - fcm
1只是想提一下,这里有关于如何使用日志重建意外删除的crontab的说明:http://superuser.com/questions/384109/crontab-deleted。虽然不完全符合你的问题,但对某些人可能会有用。 - msouth
4个回答

实际上,不建议手动处理这些文件。根据`crontab`的说明:
每个用户都可以有自己的crontab,尽管它们是在`/var/spool/cron/crontabs`目录下的文件,但并不打算直接编辑它们。
`/var/spool`目录下的文件被视为临时/工作文件,这就是为什么它们可能会在升级过程中被删除的原因,虽然对`cron`软件包的升级脚本进行仔细查看可能会解开这个谜团。
无论如何,备份您的cron条目或将它们保存在您的家目录中的文件中始终是一个好习惯。
我假设您正在使用`crontab -e`来实时创建crontab文件。如果是这样,您可以通过运行`crontab -l`来获取您的crontab文件的"副本"。将其导出到一个文件中以备份:
crontab -l > my-crontab

然后你可以编辑那个my-crontab文件来添加或修改条目,然后通过将其提供给crontab来进行“安装”。
crontab my-crontab

这与crontab -e执行相同的语法检查。


16crontab -l比浏览/var/spool/cron/crontabs/$USER要简单得多,主要是因为那个文件的权限非常奇怪。 - Oli
2iptables-save 是一个 cron 的命令。不错... - Parthian Shot
如果您在crontab中使用root帐户,那么它的sudo crontab -l > root-crontab就是用于root的crontab! - FreeSoftwareServers
12也许我们应该设置一个定时任务来自动备份自身 >:)? - PascalVKooten
5当你想要整理或检查多个用户的crontabs时,浏览/var/spool/cron/crontabs是非常方便的。 - dhasenan
"/var/spool目录下的文件被视为临时/工作文件,虽然是真的,但它们可能包含重要数据(例如未发送的邮件),因此不应该随意清除。" - Peter Green
2在调查一个你不熟悉的服务器上的谜团时,通常会使用sudo grep -rHin "$string" /etc/cron*(其中字符串可能是像dockerlftpiptables等命令)。同时,检查用户的定时任务也是个好主意。这就是我找到这个问答的原因。sudo grep -rHin "$string" /etc/cron* /var/spool/cron* - Bruno Bronosky

它存储在用户名下的/var/spool/cron/crontabs文件夹中。

我终于找到了为什么我的crontabs和Postfix安装在启动后一直出问题的原因。这是一个非常愚蠢的原因,但是...
我将/var/spool挂载为tmpfs RAM驱动器。
听起来很白痴,而且确实如此,但我遵循了旧的SSD调整之一,以延长我的SSD的寿命。在这样做时,我盲目地将/tmp、/var/tmp和/var/spool挂载为tmpfs,没有考虑后果。我认为/var/spool就像/proc/或/run/一样,只有在会话期间有用。我显然错了。

12可以将/tmp挂载为tmpfs,这样是安全的,但是不能将/var/tmp或者/var/spool挂载为tmpfs。/tmp用于临时存储,可能会在重启后丢失。/var/tmp用于临时存储,在重启后仍然保留。而正如您发现的那样,/var/spool用于待处理的数据,在重启后也会保留。 - thomasrutter
2请查看http://www.pathname.com/fhs/2.2/fhs-5.15.html。 - thomasrutter
2请注意,现代固态硬盘已经不再受写入次数的限制。 - thomasrutter

列出系统中所有用户的所有cron作业:
for user in $(cut -f1 -d: /etc/passwd)
do
  echo $user
  crontab -u $user -l
done

解决您的问题的另一种方法是将它们放置在cron.d文件夹中,并根据示例指定适当的用户每个cron:

00 01 * * * user /home/user/user-script.sh

如果您正在从另一个驱动器恢复crontab,则这将无法工作,因为crontab -u是从您当前的系统中运行的。 - JVE999
虽然我认为这是一个一行代码,因为它少于80个字符并且有一定的可读性,但我通常喜欢将代码格式化,以便人们可以复制粘贴或将其放入脚本中(在脚本中,这不是一行代码)。建议编辑... - Parthian Shot
此外,我正要将其转换为一个while read user循环,以处理用户名包含空格的情况,但显然这并不是个问题。用户名字符集非常有限。 - Parthian Shot