我试图在 /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)
手册页有一个几乎类似的示例,但我找不到它的在线版本。)