每三天可以进行一次cronjob吗?或每月10次。
Answers:
每三天运行一次...
0 0 */3 * *
那个怎么样?
如果您希望它在每月的特定日期(例如1号,4号,7号等)运行,那么您可以在脚本中添加一个条件来检查该月的当前日期。
if (((date('j') - 1) % 3))
exit();
或者,正如@mario指出的那样,您可以使用date('k')来获取一年中的某天,而不是根据月中的某天进行计算。
0 0 */3 * *
装置在第一,第四,第七等(运行*/3
装置1-31/3
的装置1,4,7...31
),所以该间隙将在月底小。(它会连续运行2个天,如果前一个月有31天。)将date('j') % 3
在该模式重新启动每年都有类似的问题,以及多年没有天数的整除3
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
因为cron是“无状态”的,所以它不能准确地表示“频率”,只有(显然)它与当前时间连续匹配的“模式”。
改写您的问题将使这一点更加明显:“是否有可能每天晚上00:01运行cronjob,但在2夜之内运行跳过夜除外?” 当cron将当前时间与工作请求时间模式进行比较时,cron无法知道它过去是否执行了您的工作。
通常,您必须终止该重复发生的事件并重新启动一个全新的事件。这说明了复杂的日历应用程序如何表示重复模式的有限的表达能力。当然,日历有很多状态-每个事件都可以[在大多数日历应用中]单独删除或重新安排。
此外,如果成功,您可能希望每3晚进行一次工作,但是如果最后一个失败,请立即重试,也许是第二天晚上(不要再等3天),甚至更快,例如一个小时后(但是请停止重试)早上到达时)。显然,cron无法知道您的工作是否成功,并且模式也无法表示出更频繁的“重试”时间表。
无论如何-您可以做自己想做的事。编写一个脚本,告诉cron在每晚00:01运行它。该脚本可以检查记录“上次运行”的某物的时间戳,如果它是> 3天前**,则执行该作业并重置“上次运行”的时间戳。
(*带时间戳记的指示器是一些持久状态,您可以操纵和检查它,但cron不能)
**如果您使用人类可读的时钟时间,请谨慎使用时间算法-一年两次,某些日子一天有23或25个小时,而一天中的02:00-02:59一天出现两次或不在所有。使用UTC可以避免这种情况。
0 0 1-30/3 * *
从1日开始,这将每三天运行一次。这是20次预定的跑步-
我认为您没有所需的东西:
0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!
不幸的是,* / 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-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...
根据本文的介绍,您需要向正在执行的命令中添加一些模数学以获取“每N天”为TRUE。例如:
0 0 * * * bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh
在此示例中,将每天在12:00 AM检查该作业,但仅在自1970年1月1日以模3为天的天数后才执行。
如果希望从特定日期起每三天一次,请使用以下格式:
0 0 * * * bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
怎么样:
00 00 * * * every 3 days && echo test
every
脚本在哪里:
#!/bin/sh
case $2 in
days)
expr `date +%j` % $1 = 0 > /dev/null
;;
weeks)
expr `date +%V` % $1 = 0 > /dev/null
;;
months)
expr `date +%m` % $1 = 0 > /dev/null
;;
esac
因此,它每天运行。
使用*/3
在每月的3号,6号,...,27号,30号运行,但是在一个月有31天之后,则错误。该every
脚本仅在年底后才出错。
您应该学习的基础知识crontab
。
按命令编辑cron crontab -e
,然后按⌃ (CTRL)+,X然后Y最后ENTER (return)在mac上按保存文件。您可以检查不是通过安装新的克隆crontab -l
crontab文件具有五个字段,用于指定分钟,小时,月,日和星期几,然后以该间隔运行命令。
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0-6) (Sunday=0)
| | | +------- month (1-12)
| | +--------- day of month (1-31)
| +----------- hour (0-23)
+------------- min (0-59)
*
上方“值”字段中的表示该列大括号中的所有合法值。
在这里,我写了一篇详细的文章:在Unix中安装Cron