/etc/cron.d/cronjob

/etc/cron.d/cronjob

我试图在 /etc/cron.d/ 中获取一个 cronjob 以在每个月的第一个星期六运行。

这是我到目前为止所拥有的:

0 1 1-7 * 6 [`date +\%d` == 06] root && /home/test/cron-test.sh

我将系统日期更改为2017年1月14日(2017年的星期六)午夜并检查tail /var/log/syslog | grep cron-test报告:

Jan 14 00:59:21 Inspiron-1545 cron[936]: Error: bad username; while reading /etc/cron.d/cron-check1
Jan 14 00:59:21 Inspiron-1545 cron[936]: (*system*cron-check1) ERROR (Syntax error, this crontab file will be ignored)

我究竟做错了什么?

答案1

系统范围的 crontab 每行有五个日期和时间字段,然后是运行 cronjob 的用户名,然后是命令行。在你的例子中,时间字段看起来不错,但第六个字段[`date对于用户名来说相当奇怪。错误消息暗示了这一点。

既然您root在括号中的代码片段之后提到过,我认为您可能只是放错了用户名,所以您应该:

0 1 1-7 * 6 root [`date +\%d` == 06] && /home/test/cron-test.sh

这仍然存在一个问题,即它[是一个像其他命令一样的命令,因此您必须在 之前[和之前使用空格]。并且==不是比较的标准,=是。另外,对于命令替换,$(cmd)比反引号更好,所以让我们尝试一下:

0 1 1-7 * 6 root [ $(date +\%d) = 06 ] && /home/test/cron-test.sh

date +%d告诉的是月份中的哪一天,现在您只在该月的第六天运行(无论工作日)。第三个和第五个字段(一个月中的某一天和一周中的某一天)一起工作有点奇怪:cronjob 运行如果任何一个其中匹配。但我们只想在星期六运行,并且只在每月的第一天到第七天运行,因此我们必须手动检查其中一个条件。

0 1 1-7 * * root [ $(date +\%u) -eq 6 ] && /home/test/cron-test.sh

cronjob 本身会在每月的前 7 天运行,但[ $(date +%u) -eq 6 ]在实际运行主命令之前,手动测试会检查星期几是否为星期六。

(某些版本的crontab(5)手册页有一个几乎类似的示例,但我找不到它的在线版本。)

相关内容