免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2851 | 回复: 10
打印 上一主题 下一主题

[系统管理] 这个需求怎么用crontab实现? [复制链接]

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-28 16:41 |只看该作者 |倒序浏览
本帖最后由 Herowinter 于 2014-08-28 20:32 编辑

我有个web应用程序会定义一些自动执行的任务,具体的一个例子,参数这样的:

日: 星期二 星期三
小时: 12点
Duration: 1440 分钟
间隔: 60 分钟

上面的参数表示希望这个任务在每周二/周三 12点开始后的1440分钟区间内(即周二/周三12点--周三/周四12点),
每隔60分钟自动执行一次.

但现在有个问题,周三12点同时处于周二的结束和周三的开始这两个点,会被执行两次,
导致重复了,请问有什么好的解决方案吗?
欢迎提出各种想法,包括对现有方案设计的吐嘈.

我在9楼有问题的进一步描述。

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-08-28 16:47 |只看该作者
本帖最后由 Herowinter 于 2014-08-28 16:52 编辑

补充一下,任务的这些参数都是用户在一个web页面定义的,
理论上允许用户输入大于0的整数,可以输入Duration大于
1天(比如1500分钟),每隔70分钟执行一次等.
这时候星期二和星期三的任务交集会更大,不止一个时间点,
而我不希望一个任务被重复执行.

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
3 [报告]
发表于 2014-08-28 16:54 |只看该作者
本帖最后由 chengchow 于 2014-08-28 16:58 编辑

就是周2中午12点到周4中午12点每小时小时运行一次对不?
0 12-23/1 *  *  1-2
0 0-11/1   *  *  2-3

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2014-08-28 17:02 |只看该作者
本帖最后由 Herowinter 于 2014-08-28 17:04 编辑

回复 3# chengchow

周二 周四 12点 每隔1小时都是变量,不是常数,
用户完全可以定义其他的,这些都是由一个程序写到crontab中的.

其实我也不是很确定我想要寻找什么.也许是一个更好的思路或处理方法,
也许是一个数学公式验证来规避这种区间的重叠,无论如何,还是谢谢了.

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
5 [报告]
发表于 2014-08-28 17:04 |只看该作者
本帖最后由 chengchow 于 2014-08-28 17:09 编辑

你不是说crontab的做法吗?
crontab里想带入变量?我没听错吧?
如果想用变量做计划任务,crontab似乎不大可能了,你可以考虑用脚本做
写个死循环,sleep 3600循环一次
2天后结束
然后用crontab调用这个脚本没周2中午12点运行,这样到可以在脚本中带入变量
甚至可以不用crontab,让脚本常驻内存,调用系统时间来判断!

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2014-08-28 17:27 |只看该作者
回复 5# chengchow

写到crontab时不是变量,是有个程序处理这些参数,然后写入crontab中的.
对于1楼的设置,可能crontab是这么写的
0 12,13,14,...23,0,1,2,..,12 * * 2
0 12,13,14,...23,0,1,2,..,12 * * 3

之所以允许用户设置超过1天的duration,因为像1楼的数据,你把周二 周三改成周二
周五,就不会有任何问题.
   

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
7 [报告]
发表于 2014-08-28 17:32 |只看该作者
回复 6# Herowinter

这样写就可以了,一小时执行一次可以把/1去掉
0 12-23 *  *  1-2
0 0-11   *  *  2-3

   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
8 [报告]
发表于 2014-08-28 18:15 |只看该作者
个人觉得, 这个需求如果要用 crontab 来实现, 需要先用程序来分析具体的执行情况时间, 然后, 去掉重复的时间点.

不过, 我没明白, 怎么会有人提需求的时候, 同时使用两种不同风格的时间方式呢?

一般来说, 指定时间点, 比如 周二, 周三, 每个小时执行一次. 又或者周二开始, 连续的 1440分钟, 每60分钟执行一次. 同时使用两种方式, 怕是不多见吧.

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
9 [报告]
发表于 2014-08-28 20:27 |只看该作者
回复 8# q1208c

多谢指点,您这么说,看样子crontab中是没办法解决了。
其实这是一个很复杂的产品中的一部分,对于一星期中不同的
天,就会生成不同的任务,这部分是在C代码做的,后台处理的
时候不同天的任务是独立去写crontab的。

这样,当用户在web UI设置的数据出现我1楼的情况时,就会出现
crontab中生成的两个任务Task1  Task2有一段区间的时间重叠,
在这段重叠区间内,定义好的Action就会被做两遍。而当这些Action
是一些数据库操作时,整个世界都乱套了。


因为我对crontab这块不是很熟,我想要确定的是,这个需求crontab
是不是可以实现,不能的话我只能去产品的其他地方想办法,这样可能
对其他模块有影响。

我接触这个产品接触时间也不长,如有什么描述不清楚的地方,请谅解。
PS:在windos下好像系统会自动调度,重叠任务不会重复执行。

   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
10 [报告]
发表于 2014-08-29 08:28 |只看该作者
回复 9# Herowinter

我大概了解你的意思.

我也曾经做过一个类似需求的东西. 当时我的需求跟你的类似. 但调度方式不同. 我要
求调度的精度更高, 要到  秒级 . 而crontab的最小调度单位是分钟. 所以, 我使用的
单独的进程来执行调度工作.

调度进程平时处于sleep状态. 每 10秒检查一次调度表, 对于更新的调度需求, 重新生
成时间轴, 然后, sleep到指定的时间再**.

关于Windows的调度算法, 我不是太了解, 因为我很少在Windows上使用. Linux 的
crontab 是严格的时间调度. 给定时间, 给定任务, 到时候就干活.

如果你一定要用crontab又不想同进运行两个进程. 可以把你的进程修改为单进程模式,
也就是同一时刻, 只能有一个实例在运行. 如果你不想改现有的代码, 也可以外加一个
shell来解决. 可以参考一下, 系统上的 /etc/init.d/ 下的 启动脚本, 它们基本上都
可以保证同一时刻只有一个实例在运行的.
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP