对于做过 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,表示在 12131415 小时
  • 列表、一个由逗号隔开的数字或范围的列表是允许的
    例如 1,2,5,9 或者 0-4,8-12
  • 步数值、步数值可以和范围一起使用
    例如在小时那里设置 10-18/2 ,表示在 10 到 18 小时之间每两小时
    当然,这样子也是可以的 */2,表示没两小时
一些例子

看语法总是枯燥的,来看几个例子就会明白了。

首先是打开并编辑当前用户的 Crontab 任务:

crontab -e

在终端上使用上面命令即可。

  1. 每分钟执行一次命令

    */1 * * * * date >> /tmp/test.log
  2. 每小时执行一次命令

    0 * * * * date >> /tmp/test.log
  3. 每天凌晨 3 点执行一次命令

    0 3 * * * date >> /tmp/test.log
  4. 在每天的第 9、10、12、17 小时执行一次命令

    0 9,10,12,17 * * * date >> /tmp/test.log
  5. 在每月的 1 ~ 10 号的 9、18 小时的每 10 分钟执行一次命令

    */10 9,18 1-10 * * date >> /tmp/test.log
最后

Crontab 是个常用的定时任务工具,但是它的最小时间单位是分钟,也就是说,如果你想设置精确到秒钟的定时任务,那么 Crontab 就无能为力了。

但是我有在 workerman 的文档中看到,他已经实现了一个毫秒级别的定时器,如果有需求,可以研究研究哈。


chenishr
238 声望11 粉丝

淡泊以明志,宁静以致远


引用和评论

0 条评论