代码改变世界

crontab设置作业间隔执行问题

  潇湘隐者  阅读(3166)  评论(6编辑  收藏  举报

这个问题源于一个网友的提问,“crontab里 */40  9  *  *  *  是不是代表9点开始每40分钟执行?”  直觉这个肯定不是从9:00开始每隔40分钟执行一次,但是也不能肯定它代表一个什么样的Schedule,那就做一个实验验证一下吧(有时候明明觉得自己已经掌握了一些知识点,但是总有一些问题,你不能很确切、肯定的回答,其实说明了还有盲点,知识点了解、掌握得不够彻底)。

 

在crontab里面设置一个下面作业,然后在日志/var/log/cron里面,你可以看到定时任务的相关日志,然后就知道了这个作业的真实Schedule 

 

*/40 9 * * * echo "hello" >> /tmp/text.txt

 

其实*/40表示一小时内每隔40分钟执行一次,但是加上*/40 9以后,表示这个作业在9点钟内,每隔四十分钟执行。也就会说这个作业会在每天的9:00、 9:40各执行一次。

 

 

如果你想在一段时间内,每隔40分钟执行一次呢? 这个要如何设置crontab作业呢? 下面总结一下如何实现类似这种需求?

 

 

方法1:如果在9点到24点之间,要求每40分钟执行一次作业。

 

那么执行的时间点为9:00 , 9:40,  10:20, 11:00, 11:40, 12:20, 13:00 .................... 此时,需要设置3个作业,如下所示:

 

#情况1
40 9,11,13,15,17,19,21,23 * * * /tmp/test.sh > /dev/null 2>&1
#情况2
20 10,12,14,16,18,20,22 * * * /tmp/test.sh > /dev/null 2>&1
#情况3
0 9,11,13,15,17,19,21,23 * * * /tmp/test.sh > /dev/null 2>&1

 

其中test.sh脚本如下,此脚本为了方便验证作业执行时间。

 

# more test.sh
#! /bin/bash
 
echo `date '+%Y-%m-%d %H:%M:%S'` >> /tmp/test.txt

 

 

当然,你也可以简单一点

 

#情况1
40 9-23/2 * * * /tmp/test.sh > /dev/null 2>&1
#情况2
20 10-22/2 * * * /tmp/test.sh > /dev/null 2>&1
#情况3
0 9-23/2 * * * /tmp/test.sh > /dev/null 2>&1

 

 

方法2:将日期时间转化为Unix time (也叫Epoch time),然后用求余的方法解决问题。如下所示

 

# cat /tmp/kkk.sh
#! /bin/bash
 
minutesSinceEpoch=$(($(date +'%s / 60')))
 
# every 40 minutes
if [[ $(($minutesSinceEpoch % 40)) -ne 0 ]]; then
    exit 0
fi
 
echo `date '+%Y-%m-%d %H:%M:%S'` >> /tmp/test.log
编辑推荐:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2011-05-04 ORACLE用户管理
2011-05-04 【转】软件开发工具介绍之 6.Web开发工具
2011-05-04 【转】三大UML建模工具Visio、Rational Rose、PowerDesign的区别
点击右上角即可分享
微信分享提示