为什么我的 Ubuntu crontab 是临时的?

为什么我的 Ubuntu crontab 是临时的?

几个小时前,我刚刚创建了一个新的 VPS 环境,并在开始时执行了 crontab -e,从文件中粘贴了我的 cronjobs,然后保存。

几分钟前我执行了 crontab -ea 并看到文件名是:

/tmp/crontab.MSK8I2/crontab

在此处输入图片描述

为什么?谢谢,

答案1

跑步crontab -e 编辑用户的 crontab(而不是系统 crontab /etc/crontab)。如果你运行sudo crontab -e,这将编辑 root 帐户的用户 crontab (即不是与 相同/etc/crontab)。root 账户的用户 crontab 可用,但通常不是系统管理员希望编辑的。

当您运行 时crontab -e,该crontab实用程序会将正在编辑的特定用户特定的 crontab 文件复制到临时文件中。这是预期的正确行为。假设您在编辑器中对临时文件进行了更改,crontab则在您完成编辑后会自动将这些更改写回 crontab 文件。


布赖安解释了为什么以及如何做到这一点的一些细节在 ”Cron、crontab -e 读取了错误的文件“ 在Unix操作系统

这是默认行为crontab -e将 crontab 文件复制到临时目录,然后使用 VISUAL 或 EDITOR 环境变量中列出的编辑器打开此文件,保存时会尝试将文件复制到原始位置。这是一个原子操作。

其背后的原因多种多样,包括防止两个用户同时编辑同一个文件、在写入原始文件之前进行健全性/语法检查等。

啊,crontab -e除非您使用 Debian,否则也不要以任何方式修剪文件。


你问题中的截图显示了类似这样的内容,这是用户Ubuntu 中的 crontab:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

相比之下,/etc/crontabUbuntu 中的默认系统 crontab()如下所示:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

作为siloko 解释在 ”Crontab -e 每次运行时都会打开新文件”,并且如默认系统 crontab 的前导注释(如上所示)中所述,系统范围的 crontab/etc/crontab与每个用户的 crontab 的不同之处在于,每个条目都包含一个字段,用于指定哪个用户运行该命令。上面的示例root针对三个命令中的每一个,但您可以通过在该字段中指定其他用户的用户名来使命令以其他用户的身份运行。

虽然我不能确定,但​​我猜测您正在尝试编辑系统 crontab,而不是 root(或任何其他人的)用户 crontab。


进一步阅读:

相关内容