我需要安排一个 cron 作业在每月第一个星期四下午 3:00 运行。我怎样才能做到这一点? 我读过另一个与此类似的主题,但它是针对每个月的第一个星期日的。我如何修改它以满足我的需要?请不要让我参考任何手册,因为它们对我没有任何帮助。这就是为什么我在这里问这个问题。
每个月的第一个星期日
00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script
这里应该有一个简单的答案,我只是不知道
-le 07
代表什么。
所以 4 是星期四,cron 中的
-le 07
是什么?
是每月第7天(星期日)的支票吗?
00 15 * * 4 [ $(date +\%d) -le 07 ] && /run/your/script
或者应该是这个?
假设这是该月第一个第四天(星期四)的支票?
00 15 * * 4 [ $(date +\%d) -le 04 ] && /run/your/script
由于英语不是我的母语,我希望这对你们来说尽可能清楚。
提前致谢。
答案:
0 15 * * 4 [ $(date +\%d) -le 7 ] && command
说明:
首先,您需要意识到该月的第一个星期四始终会在集合中找到该月的某一天
{1,2,3,4,5,6,7}
。那只是因为一周只有7天。因此,第一个星期四不能有大于 7 的日子。对于任何其他工作日(例如星期二或星期六)显然也是如此。
cron 将执行的命令由两部分组成:
[ $(date "+\%d") -le 7 ]
: 这是一个简单的测试,检查该月的某一天是否小于 7。它本质上检查我们是否处于该月的第一周。命令 date -d "+%d"
以两位数 (01,02,03,...,31
) 的形式返回月份中的日期,并且是一个字符串。 test
命令,这里以方括号 [ ... ]
的替代形式编写,会检查来自 date
的整数是否小于或等于 7。您可以在输入 man test
时阅读更多相关内容在终端中。command
:这是如果前面的test
成功则将要执行的命令。 IE。如果我们在这个月的第一周。之所以只有在 test
命令成功时才会执行,是因为 &&
。 cmd1 && cmd2
形式的命令将执行 cmd1
,并且只有当该命令成功时才会执行 cmd2
。既然我们现在有了命令,我们现在就可以构建我们的 crontab 文件了。再多一点注释(以
#
开头的部分,你可以写成:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
0 15 * * 4 [ $(date +\%d) -le 07 ] && command
上面的意思是,在任意星期四的第 15 点 0 分钟执行上述命令。由于该命令包含第一周的测试,因此它只会在该月的第一个星期四运行。
为什么不简单地使用:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
0 15 1-7 * 4 command
因此,您告诉 cron 在该月的前 7 天、第 4 天(星期四)的 0 分钟、15 小时运行。它肯定只包括一个星期四,第一个星期四,因为一个月连续 7 天肯定只有一个星期四,连续 7 天不可能有 2 个星期四。
您可以在每月的第二个星期四这样做:
0 14 /15,/16,/17,/18,/19,/20,*/21 *周四
“每月15日、每月16日、每月17日、每月18日、每月19日、每月20日14:00 -每月,以及每个月的第 21 天(如果是星期四)。”
为什么不
00 09 1-7 * 4
?
“每月 1 日至 7 日以及星期四的 09:00。”
https://crontab.guru/#00_03_1-7_*_4
这似乎比使用 bash hack 更好..