对于做过 Web 开发的人来说,定时任务这个东西应该不会感到陌生;而说到定时任务,就应该都会想到 Crontab ,即使想不到,百度谷歌一下,返回的大部分结果都是指向 Linux 的 Crontab 的!
最近在找工作,除了面试之外,倒也没什么重要的事情了。趁着有时间,正好总结一下 Crontab 的知识点,万一刚好被哪个面试官问道了呢 ^_^
我现在还记得第一次使用 Crontab 是一个什么场景。当时是自己一个人独立开发一个游戏金币商城,主要服务的对象是海外的客户,包括美国、泰国等。金币商城的默认币种是美元($),当然可以切换成泰铢(฿)、欧元(€)等。币种之间的转换是以美元为单位,根据各币种与美元之间的汇率来转换的。
商城开发完成,上线一段时间之后,老板突然找到我说,“小陈啊,泰国有个家伙买了 10000 龙之谷的 金币,它付款的金额怎么不对啊?”。我就赶紧检查是计算错误呢还是什么其他原因了。
后来发现是币种之间的汇率每天变化造成的,后来通过 Crontab 定时更新汇率数据来避免这个问题。
就这样,我了解到了 Crontab。
关于 Crontab 命令
命令语法:
crontab [-u user] [-l | -r | -e]
常用参数的含义:
参数 | 含义
---|----u user | 指定特定的用户;如果该选项缺省,则默认操作命令执行者的-l | 显示当前的定时任务-r | 删除当前的定时任务-e | 编辑当前的定时任务Crontab 任务的语法
* * * * * 命令| | | | || | | | +---> 星期几(0 ~ 6),0 = 星期天| | | +-------> 月份(1 ~ 12)| | +-----------> 几号(1 ~ 31)| +---------------> 小时(0 ~ 23)+-------------------> 分钟(0 ~ 59)
如上所示,Crontab 任务由两部分组成,前面星号部分代表时间,后面代表需要执行的命令。
- 星号、字段可以设置为星号
*
,表示“从头到尾” 例如在分钟那里设置*
,则表示每分钟执行一次 - 范围、范围由两个数字加中间一个连字符
-
表示,表示某个区间 例如在小时那里设置12-15
,表示在12
,13
,14
,15
小时 - 列表、一个由逗号隔开的数字或范围的列表是允许的 例如
1,2,5,9
或者0-4,8-12
- 步数值、步数值可以和范围一起使用 例如在小时那里设置
10-18/2
,表示在 10 到 18 小时之间每两小时 当然,这样子也是可以的*/2
,表示没两小时
一些例子
看语法总是枯燥的,来看几个例子就会明白了。
首先是打开并编辑当前用户的 Crontab 任务:
crontab -e
在终端上使用上面命令即可。
-
每分钟执行一次命令
*/1 * * * * date >> /tmp/test.log
-
每小时执行一次命令
0 * * * * date >> /tmp/test.log
-
每天凌晨 3 点执行一次命令
0 3 * * * date >> /tmp/test.log
-
在每天的第 9、10、12、17 小时执行一次命令
0 9,10,12,17 * * * date >> /tmp/test.log
-
在每月的 1 ~ 10 号的 9、18 小时的每 10 分钟执行一次命令
*/10 9,18 1-10 * * date >> /tmp/test.log
最后
Crontab 是个常用的定时任务工具,但是它的最小时间单位是分钟,也就是说,如果你想设置精确到秒钟的定时任务,那么 Crontab 就无能为力了。
但是我有在 的文档中看到,他已经实现了一个毫秒级别的定时器,如果有需求,可以研究研究哈。