我想安排一项任务在特定月份的某一周的指定日期之前几秒、几分钟、几小时、几天或几周运行。示例如下:
- 每月最后一个星期二前 7 天上午 8 点
- 每月第二个星期六前 11 天上午 10 点
- 每月最后一个星期五前三天下午 6 点
我习惯设置 cron/at 在指定日期运行作业,并且意识到如果我想按照这些类型的时间表运行,我可能必须结合 cron 运行脚本。
有人能举出我该如何做这件事的例子吗?
答案1
对于您的第一个例子,在每月最后一个星期二之前 7 天的早上 8 点,我会这样做:
0 8 * * 2 [[ $(date +%m) -eq $(date -d +7days +%m) ]] && [[ $(date +%m) -ne $(date -d +14days +%m) ]] && myscript
它的作用是每周二上午 8 点运行(0 8 * * 2
),然后说“如果从现在起 7 天后的月份与本月相同”(即,这不是最后的星期二)和“如果从现在起 14 天的月份是不是与本月相同”(即,这是该月的倒数第二个星期二),然后运行myscript
。
从技术上来说,这可能更有效率——例如,知道该月的倒数第二个星期二不能是该月的第一天——但这只会让它更难理解。:) 此外,根据 cron 运行的具体 shell 等等,可能需要一些引用(+%m
可能需要是"+%m"
)或可能需要转义百分号(即+%m
可能需要是+\%m
)。
将这一技巧推广到其他日子和高级组合就留给读者练习了。