我需要安排一个 cron 作业在每个月的第一个星期四下午 3:00 运行。我怎样才能做到这一点?我读过另一个与此类似的主题,但它是针对每个月的第一个星期天。我如何修改它以满足我的需求?请不要让我参考任何手册,因为它们对我没有帮助。这就是我在这里问这个问题的原因。
每个月的第一个星期日
00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script
Run Code Online (Sandbox Code Playgroud)
一个简单的答案应该在这里做,我只是不知道-le 07代表什么。
所以 4 是星期四,-le 07cron 是什么?
是每月第 7 天(星期日)的支票吗?
00 15 * * 4 [ $(date +\%d) -le 07 ] && /run/your/script
还是应该是这个?
假设这将是本月第 4 天(星期四)的支票?
00 15 * * 4 [ $(date +\%d) -le 04 ] && /run/your/script
由于英语不是我的母语,我希望这对你们来说尽可能清楚。
提前致谢。
答案:
0 15 * * 4 [ $(date +\%d) -le 7 ] && command
Run Code Online (Sandbox Code Playgroud)
说明:
首先,您需要意识到每月的第一个星期四将始终有一个月中的某一天{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成功,这是将要执行的命令。即,如果我们在本月的第一周。只有在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
Run Code Online (Sandbox Code Playgroud)
上面的意思是,在任何星期四的第 15 个小时的第 0 分钟执行上面的命令。由于该命令包含第一周的测试,因此它只会在该月的第一个星期四运行。