Q1

Q1

我正在尝试通过创建文件来设置 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 -ecrontab -l然后,经过一段(长时间)时间,您可能会尝试了解它的/etc/crontab作用。

有关的


编辑

既然你问:

crontab -e 可以在 /etc/cron.d/ 中创建 cron 作业吗?

不,我不是那个意思。 Cron 作业(针对用户)位于/var/spool/cron/crontabs(类似 Debian 的发行版中)。这就是命令crontab -e编辑它们的地方。

通常(之前)编辑的/etc/crontabsystem作业,安装的软件包(如 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.

相关内容