如何设置cron每40分钟/ 25分钟运行我的脚本?

cr8*_*ith 17 cron crontab

我希望脚本在第40分钟开始每40分钟运行一次.
这意味着:

00:40, 01:20, 02:00, 02:40, 03:20...
Run Code Online (Sandbox Code Playgroud)

所以我把这个条目改为cron:

*/40 * * * * /path/to/script/foo.sh
Run Code Online (Sandbox Code Playgroud)

不幸的是,这每小时每40分钟运行一次脚本:

00:40, 01:40, 02:40...
Run Code Online (Sandbox Code Playgroud)

我打算每25分钟运行一次的脚本也是如此.

我在这里错过了什么吗?


答案
好吧,如果你碰巧在这里遇到同样的问题
,我就是这样解决的:

# 40mins-interval
40 0 * * * /path/foo.sh         (0)
0,40 2-22/2 * * * /path/foo.sh  (2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22)
20 1-23/2 * * * /path/foo.sh    (1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23)  


# 25mins-interval
25,50 0 * * * /path/foo.sh              (0)
0,25,50 5-20/5 * * * /path/foo.sh       (5, 10, 15, 20)
15,40 1-21/5 * * * /path/foo.sh         (1, 6, 11, 16, 21)
5,30,55 2-22/5 * * * /path/foo.sh       (2, 7, 12, 17, 22)
20,45 3-23/5 * * * /path/foo.sh         (3, 8, 13, 18, 23)
10,35 4-19/5 * * * /path/foo.sh         (4, 9, 14, 19)
Run Code Online (Sandbox Code Playgroud)

注意:
1.此计划中仍会发生冲突(即:查看在两个时间间隔的第0和第10分钟运行的计划).
2.脚本将不会在今天第二天的最后一次运行的确切时间间隔内运行(即:25分钟间隔在今天23:45结束,从第二天开始@ 00:25).

Udo*_*eld 14

它总是只分割当前小时.

40/40 = 1所以它每40分钟运行一次.

*/5会做5,10,15,20 ......

你应该去更大的间隔.

25分钟间隔为*/30,间隔40分钟为60分钟.

否则为脚本设置两个crontabs:

0,40 */2 * * * /path/to/script/foo.sh
20 1,3,5,7,9,11,13,15,17,19,21,23 * * * /path/to/script/foo.sh
Run Code Online (Sandbox Code Playgroud)


Bla*_*ine 5

对于要完成的任务,您必须在crontab中编写更复杂的条目.

你看到上面的模式?

00:40,01:20,02:00,02:40,03:20再次04:00,04:40,05:20,06:00,06:40,07:20,08:00

我可以把它分成三个条目:

  1. 每隔一小时你就必须在第40分钟运行它
  2. 每个奇数小时你必须在20分钟运行它
  3. 每隔一小时你就必须在0上运行它.(0小时除外)

您可以使用多个条目完成此操作:

#1
*/40 0,*/2 * * * /path/to/script/foo.sh
#2
*/20 1,*/2 * * * /path/to/script/foo.sh
#3
0 2,*/2 * * * /path/to/script/foo.sh
Run Code Online (Sandbox Code Playgroud)

注意:它可能有小问题,但我给你指导:)

PS:这将解释更多


And*_*son 5

您需要将同一脚本的多个条目添加到 cron,一个用于整点运行,一个用于过去 20 点,一个用于整点 20 点。

0 0,2,4,6,8,10,12,14,16,18,20,22 * * * script
20 1,3,5,7,9,11,13,15,17,19,21,23 * * * script
40 0,2,4,6,8,10,12,14,16,18,20,22 * * * script
Run Code Online (Sandbox Code Playgroud)

你说它应该在 00:40 开始,但前一天的运行将在 23:20。你想要在午夜前后有 80 分钟的间隔吗?


ste*_*ric 5

如果计算自Epoch以来的分钟(、小时、天或周),您可以达到任何频率,在脚本顶部添加一个条件,并将脚本设置为在 crontab 上每分钟运行,则可以实现任何频率:

\n\n
#!/bin/bash\n\nminutesSinceEpoch=$(($(date +\'%s / 60\')))\n\n# every 40 minutes\nif [[ $(($minutesSinceEpoch % 40)) -ne 0 ]]; then\n    exit 0\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n

date(1)返回当前日期,我们将其格式化为自纪元以来的秒数(%s ) 以来的秒数,然后我们进行基本数学运算:

\n\n
# .---------------------- bash command substitution\n# |.--------------------- bash arithmetic expansion\n# || .------------------- bash command substitution\n# || |  .---------------- date command\n# || |  |   .------------ FORMAT argument\n# || |  |   |      .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command\n# || |  |   |      |\n# ** *  *   *      * \n  $(($(date +\'%s / 60\')))\n# * *  ---------------\n# | |        | \n# | |        \xc2\xb7----------- date should result in something like "1438390397 / 60"\n# | \xc2\xb7-------------------- it gets evaluated as an expression. (the maths)\n# \xc2\xb7---------------------- and we can store it\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以将此方法用于每小时、每天或每月的 cron 作业:

\n\n
#!/bin/bash\n# We can get the\n\nminutes=$(($(date +\'%s / 60\')))\nhours=$(($(date +\'%s / 60 / 60\')))\ndays=$(($(date +\'%s / 60 / 60 / 24\')))\nweeks=$(($(date +\'%s / 60 / 60 / 24 / 7\')))\n\n# or even\n\nmoons=$(($(date +\'%s / 60 / 60 / 24 / 656\')))\n\n# passed since Epoch and define a frequency\n# let\'s say, every 7 hours\n\nif [[ $(($hours % 7)) -ne 0 ]]; then\n    exit 0\nfi\n\n# and your actual script starts here\n
Run Code Online (Sandbox Code Playgroud)\n