Luk*_*ach 133
你可以把这样的东西放在crontab文件中:
00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script
Run Code Online (Sandbox Code Playgroud)
该date +%d给你当天的号码,然后你可以检查,如果这一天是小于或等于7.如果是这样,运行命令.
如果仅在星期日运行此脚本,则应表示它仅在该月的第一个星期日运行.
请记住,在crontab文件中,date应该转义命令的格式选项.
Pēt*_*une 13
有一种巧妙的方法可以使用经典的(Vixie、Debian)cron 来做到这一点:
\n0 9 1-7 * */7\nRun Code Online (Sandbox Code Playgroud)\n星期字段以星号 ( *) 开头,因此 cron 认为它“不受限制”,并在月份字段和星期字段之间使用 AND 逻辑。
*/7表示“从工作日 0(星期日)开始每 7 天”。实际上,这意味着“每个星期日”。
这是我的文章,其中包含更多详细信息:Schedule Cronjob for the First Monday of Every Month, the Funky Way
\n注意 \xe2\x80\x93 这是一个 hack。如果您使用此表达式,请确保将其记录下来以避免以后混淆。
\nDir*_*tel 12
您需要结合两种方法:
a)用于cron每周日上午9:00开始工作.
00 09 * * 7 /usr/local/bin/once_a_week
Run Code Online (Sandbox Code Playgroud)
b)在开始时once_a_week,计算日期并通过shell,Python,C/C++,...和1到7之间的测试来提取月份的日期.如果是这样,执行真实的脚本; 如果没有,请默默退出.
值得一提的是,是什么样子的最显而易见的方法解决这个问题确实不工作。
您可能以为您可以编写一个crontab条目,将星期几指定为0(代表星期日),将星期几指定为1-7,就像这样……
# This does NOT work.
0 9 1-7 * 0 /path/to/your/script
Run Code Online (Sandbox Code Playgroud)
...但是,由于Cron处理指定了星期几和星期几的crontab行的方式有些怪异,因此无法使用,实际上会在第1、2、3日运行, 4日,5日,6日和本月7日(不管它们是什么星期几),并在每一个月的星期天。
这就是为什么您会看到建议使用[ ... ]check with date设置这样的规则的原因-在crontab中指定星期几,并使用[and date在运行以下命令之前检查星期几是否小于等于7。脚本,如接受的答案所示,或在crontab 中指定星期几的范围,并使用[和date检查运行前的星期几,如下所示:
# This DOES work.
0 9 1-7 * * [ $(date +\%u) = 7 ] && /path/to/your/script
Run Code Online (Sandbox Code Playgroud)
如果您想确保crontab行不管在什么操作系统上使用都可以工作,请记住一些最佳做法:
=而不是==进行比较。因为不是所有的shell都使用[支持==操作员的实现,所以它更加可移植。%u符来date获取星期几(而不是%a运算符)作为数字,因为%a根据date运行的语言环境得出不同的结果。date,不使用/bin/date或/usr/bin/date,因为该date实用程序在不同系统上的位置不同。小智 5
这也适用于工作日的名称:
0 0 1-7 * * [ "$(date '+\%a')" == "Sun" ] && /usr/local/bin/urscript.sh
Run Code Online (Sandbox Code Playgroud)
但,
[ "$(date '+\%a')" == "Sun" ] && echo SUNDAY
由于 crontab 中对“%”的特殊处理,命令行将失败(也适用于/sf/answers/226951861/)
在第一个星期一,第三个星期二,最后一个星期日执行一次cron任务。
http://xr09.github.io/cron-last-sunday/
只需将run-if-today脚本放在路径中,然后与cron一起使用即可。
30 6 * * 6 root run-if-today 1 Sat && /root/myfirstsaturdaybackup.sh
Run Code Online (Sandbox Code Playgroud)
run-if-today如果是正确的日期,脚本将仅返回0(bash值为True)。
编辑:
现在有了更简单的界面,星期数只需一个参数。
# run every first saturday
30 6 * * 6 root run-if-today 1 && /root/myfirstsaturdaybackup.sh
# run every last sunday
30 6 * * 7 root run-if-today L && /root/lastsunday.sh
Run Code Online (Sandbox Code Playgroud)