我正在尝试通过创建文件来设置 cron 作业/etc/cron.d/myjob
:
55 * * * * t echo hello > /tmp/cron.log && cd /tmp/test/ && pwd > /tmp/cron.log
我尝试使用重定向来验证作业是否已成功安排。我在21:50创建了该文件,5分钟后即21:55时,仍然没有创建/tmp/cron.log。我想知道为什么?
我指定用户要t
从事 中的工作/etc/cron.d/myjob
。但 cron 作业是谁的呢?我不确定,所以我尝试了下面的两个命令。两者都没有显示我创建的工作。
$ crontab -l
no crontab for t
$ sudo crontab -l
[sudo] password for t:
no crontab for root
我的 /etc/crontab 没有显式读取 /etc/cron.d/ 下的文件。见下文。这可能是我的 cron 作业没有运行的原因吗?谢谢。
# /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 )
#
更新:
感谢杰夫。更改权限/etc/cron.d/myjob
即可rw-r--r--
解决问题。为什么我的工作文件的原始rw-rw-r--
权限不起作用,但却rw-r--r--
是必需的?/etc/cron.d/
和下的文件/etc/cron.daily/
是否必须具有相同的权限rw-r--r--
?
为什么/etc/crontab
不需要显式读取 下的文件/etc/cron.d/
?
答案1
Q1
为什么我的作业文件原来的rw-rw-r--权限不起作用
从man cron
:
/etc/crontab 和 /etc/cron.d 中的文件必须由 root 所有,并且不能是组或其他可写的。
所以,里面的文件/etc/cron.d
应该是:
chown root:root /etc/cron.d/*
chmod go-wx /etc/cron.d/*
chmod -x /etc/cron.d/*
Q2
为什么/etc/crontab不需要显式读取/etc/cron.d/下的文件?
不,它不是这么说的。说的man 5 crontab
是:
/etc/crontab:系统范围的 crontab 与任何其他 crontab 不同,当您编辑此文件和 /etc/cron.d 中的文件时,您不必运行“crontab”命令来安装新版本。这些文件还具有用户名字段,这是其他 crontab 所没有的。
这意味着无需运行即可crontab -e
编辑和安装新的 cron 作业。下面的文件/etc/cron.d/
由以下人员读取和解释cron
一旦编辑。并且其中定义的作业将按计划执行,而无需调用crontab
可执行文件。
警告
但您还应该阅读man cron
:
一般来说,系统管理员不应该使用/etc/cron.d/,而应使用标准系统crontab /etc/crontab。
这意味着执行 acrontab -e
来创建 cron 作业。
一般来说,直接编辑/etc/crontab
(或文件)是一个坏主意,特别是对于新用户来说。/etc/cron.d
习惯使用 和 来管理 cron 作业crontab -e
,crontab -l
然后,经过一段(长时间)时间,您可能会尝试了解它的/etc/crontab
作用。
编辑
既然你问:
crontab -e 可以在 /etc/cron.d/ 中创建 cron 作业吗?
不,我不是那个意思。 Cron 作业(针对用户)位于/var/spool/cron/crontabs
(类似 Debian 的发行版中)。这就是命令crontab -e
编辑它们的地方。
通常(之前)编辑的/etc/crontab
是system
作业,安装的软件包(如 anacron)用来安排自己的作业的作业。这不是用户应该编辑的文件。在debian中,有一个目录可以添加新的作业,可以避免编辑文件出错的问题(/etc/crontab
)。该目录是/etc/cron.d/
.但是,这仍然不是一个供用户(甚至管理员)手动编辑的目录。
这类似于询问用户为什么不应编辑该/etc/sudoers
文件。
当然,用户(作为 root)可以执行nano /etc/sudoers
和更改该文件。系统不会阻止root。但这是一个“坏主意”。
crontab 手册具有误导性,因为它是为与开发人员(而不是用户)交谈而编写的。它解释了开发人员应该在这些文件中执行哪些操作。
为什么
关于:您为什么认为需要添加/etc/crontab
(或/etc/cron.d
) ?
这两个地方的文件包含“行”,每一行都是一个作业。
使用 编辑的行完全相同crontab -e
。每一行都是一个由 cron 执行的作业。唯一的区别是,在这两个地方,作业行包含一个附加字段“用户”。但:
crontab -u user1 -e
还将添加将以“user1”身份执行的新行(作业)(如果运行该命令的用户具有正确的权限)。唯一的(实际)区别是用户可以编辑这些作业,但不能编辑/etc/crontab
或中的作业/etc/cron.d/
。在我看来,这似乎是一个好主意,可以避免用户编辑其他用户的作业。
简而言之:添加职位:使用crontab -e
.