sbe*_*rry 107
每三天运行一次......
0 0 */3 * *
Run Code Online (Sandbox Code Playgroud)
那个怎么样?
如果你希望它在一个月的特定日期运行,比如第1天,第4天,第7天等等,那么你可以在脚本中设置一个条件来检查当月的当天.
if (((date('j') - 1) % 3))
exit();
Run Code Online (Sandbox Code Playgroud)
或者,正如@mario指出的那样,您可以使用日期('k')来获取一年中的某一天,而不是根据月中的某天来完成.
小智 63
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
Run Code Online (Sandbox Code Playgroud)
Fab*_*sco 15
我不是cron专家,但是如何:
0 */72 * * *
Run Code Online (Sandbox Code Playgroud)
它将每72小时不间断运行。
https://crontab.guru/#0_ / 72_ _ _
小智 14
因为cron是"无状态的",它不能准确地表达"频率",只能表示它(显然)与当前时间不断匹配的"模式".
改述你的问题让这更加明显:"是否有可能在每晚00:01运行一个cronjob,除了在2晚内运行时跳过夜晚?" 当cron将当前时间与作业请求时间模式进行比较时,cron无法知道它是否在过去运行您的工作.
(当然有可能编写一个记录过去作业的有状态cron,因此包括匹配此状态的模式,但这不是大多数操作系统中包含的标准cron.这样的系统会因为要求引入概念而变得复杂.当这样的模式"重置"时.例如,当时间改变时模式是否重置(即修改了crontab条目)?查看您最喜欢的日历应用程序,看看它能表达的复杂模式的重复模式,以及请注意,他们没有重置问题,因为起始日历事件具有自然的"开始"a/k /"重置"日期.请尝试重新安排每隔一周的重复日历事件,以推迟一周,过圣诞节例如.通常你必须终止那个反复出现的事件并重新启动一个全新的事件;这说明即使复杂的日历应用程序代表重复模式的表达也有限.当然,日历有很多 state--每个单独的事件可以独立删除或重新安排[在大多数日历应用程序中]).
此外,如果成功,您可能希望每隔3晚完成一次工作,但如果最后一次失败,请立即重试,也许第二天晚上(不要再等3天)或更快,比如一小时后(但停止重试)在早上到达).很明显,cron不可能知道你的工作是否成功,而且这种模式也不能表达另一种更频繁的"重试"时间表.
无论如何 - 你可以做自己想做的事.写一个脚本,告诉cron每天早上00:01运行它.此脚本可以检查记录"上次运行"的*的时间戳,如果> 3天前**,则执行作业并重置"上次运行"时间戳.
(*时间戳指示符是一些持久状态,你可以操作和检查,但cron不能)
**如果你使用人类可读的时钟时间,请注意时间算术 - 一年两次,有些日子一天有23或25小时,02:00-02:59在一天内发生两次或不在所有.使用UTC来避免这种情况.
小智 11
我不认为你有你需要的东西:
0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!
Run Code Online (Sandbox Code Playgroud)
不幸的是, */3 是在每月的每 n 天而不是 每 n 天设置间隔。请参阅:此处的解释。在月底有保证的经常性问题。
1st at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-02-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...
Run Code Online (Sandbox Code Playgroud)
根据这篇文章,您需要向正在执行的命令添加一些模数运算,以获得“每 N 天”的 TRUE。例如:
0 0 * * * bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh
Run Code Online (Sandbox Code Playgroud)
在此示例中,作业将在每天上午 12:00 进行检查,但仅在自 01-01-1970 模 3 以来的天数为 0 时才会执行。
如果您希望从特定日期开始每 3 天发送一次,请使用以下格式:
0 0 * * * bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh'
Run Code Online (Sandbox Code Playgroud)
0 0 1-30/3 * *
Run Code Online (Sandbox Code Playgroud)
这将从第1天开始每三天运行一次.以下是20个预定的运行 -