我想通过cron运行一个工作,这个工作将在每天的特定时间每两周执行一次.每周二都很容易:
0 6 * * Tue
但是如何在"每隔一个星期二"(或者如果你愿意 - 每隔一周)制作它?我不想在它自己的脚本中实现任何逻辑,但只保留在cron中的定义.
修改您的星期二cron逻辑,以便自纪元以来每隔一周执行一次.
知道一周有604800秒(忽略DST更改和闰秒,谢谢),并使用GNU日期:
0 6 * * Tue expr `date +\%s` / 604800 \% 2 >/dev/null || /scripts/fortnightly.sh
日历算术很令人沮丧.
@ xahtep的答案非常棒,但正如@Doppelganger在评论中指出的那样,它会在某些年份的界限上失败.该date
实用程序的"一年中的一周"说明符都不能在这里提供帮助.1月初的某个星期二将不可避免地重复前一年最后一个星期二的周平价:2016-01-05(%V),2018-01-02(%U)和2019-01-01(%W) .
怎么样,crontab
即使它没有在前五个字段中精确定义,它确实保持在它:
0 6 * * Tue expr `date +\%W` \% 2 > /dev/null || /scripts/fortnightly.sh
pilcrow的答案很棒.然而,这导致每运行fortnightly.sh脚本甚至一周(自纪元).如果您需要在奇数周运行脚本,您可以稍微调整一下他的答案:
0 6 * * Tue expr \( `date +\%s` / 604800 + 1 \) \% 2 > /dev/null || /scripts/fortnightly.sh
将1更改为0会将其移回甚至数周.