我希望脚本在第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)
对于要完成的任务,您必须在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 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:这将解释更多
您需要将同一脚本的多个条目添加到 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 分钟的间隔吗?
如果计算自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\nRun Code Online (Sandbox Code Playgroud)\n\ndate(1)返回当前日期,我们将其格式化为自纪元以来的秒数(%s ) 以来的秒数,然后我们进行基本数学运算:
# .---------------------- 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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n