【发布时间】:2021-07-29 21:01:58
【问题描述】:
我想在每个星期六安排一些脚本。
我尝试了一些方法,例如使用一个月中的几天,但它们似乎不是获得像 10 22 1-7,15-21,29-31 * 6
应该有一些更好的解决方案来安排在周六轮流执行的任务。
【问题讨论】:
标签: python-3.x bash cron
我想在每个星期六安排一些脚本。
我尝试了一些方法,例如使用一个月中的几天,但它们似乎不是获得像 10 22 1-7,15-21,29-31 * 6
应该有一些更好的解决方案来安排在周六轮流执行的任务。
【问题讨论】:
标签: python-3.x bash cron
如果想要有特殊条件,一般需要自己通过测试实现条件。下面是一般结构:
# 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
10 22 * * 6 testcmd && command
命令testcmd 通常在测试成功时返回退出代码 0,如果测试失败则返回 1。如果testcmd 成功,则执行command。以下帖子中有一些使用类似技巧的示例:
获得所需内容的最简单方法是选择星期六为奇数周或偶数周。测试命令testcmd 将如下所示:
(( $(date "+\%d") \% 14 < 7 )) : 将您的月份以 14 天为一组进行分组,并仅选择其中的前 7 天。这存在连续两周有效的问题。例如,如果 1 月 30 日是星期六,那么这个星期六和下一个星期六(2 月 6 日)都有效。(( $(date "+\%V") \% 2 == 0 )) : 将您的年份以两周为一组进行分组,并仅选择该周的第一周。这有一个问题,即 53 周的年份可以在 12 月底和 1 月初创建两个连续的有效星期六。这种情况并不常见,但可能会发生。最可靠的解决方案是 *how to set cronjob for 2 days? 中提出的解决方案,我们将问题更改为每 14 天一次。根据我对该问题的回答,您可以对其进行调整以形成一个小可执行文件,从而为您创建完美的testcmd:
将上面的testcmd替换为/path/to/testcmd 14 20210731,其中后者是读取的脚本;
#!/usr/bin/env bash
# get start time in seconds
start=$(date -d "${2:-@0}" '+%s')
# get current time in seconds
now=$(date '+%s')
# get the amount of days (86400 seconds per day)
days=$(( (now-start) /86400 ))
# set the modulo
modulo=$1
# do the test
(( days >= 0 )) && (( days % modulo == 0))
【讨论】: