crontab 是 Linux 系统自带的一个简单轻量的定时任务管理工具,相信做服务器端开发或运维的人员应该非常熟悉它。
crontab 只支持一些简单的任务定时处理方案,但配合一定的技巧方法,也能完成一些高级的定时任务需求。

基本的使用方法

crontab 配置的规则如下:

minute hour day month weekday command
  • minute 分钟数设置,取值范围是0-59,示例:
    • 指定分钟数:0100,15,30,45
    • 指定分钟范围数:1-151-15,30-45
    • 指定每N分钟:*/15*/15,*/20
  • hour 小时数设置,取值范围是0-59,配置方式如minute
  • day 天设置,取值范围是1-31,配置方式如minute
  • month 月份设置,取值范围是1-12,配置方式如minute
  • weekday 周设置,取值范围是0-6,0表示星期天,配置方式如minute
# 一次性执行的任务
30 10 1 6 * /bin/php buy-a-gift-for-my-son.php 2>&1 > /dev/null
# 周期性执行的任务
0 18 * * 5 /bin/php send-all-workds-to-boss.php 2>&1 > /dev/null

设置秒级任务

crontab不支持秒定时,但如果想要把任务定时到秒级,可以结合sleep来完成,如:

* * * * * /bin/php check-task-status.php 2>&1 > /dev/null
* * * * * sleep 15 && /bin/php check-task-status.php 2>&1 > /dev/null
* * * * * sleep 30 && /bin/php check-task-status.php 2>&1 > /dev/null
* * * * * sleep 45 && /bin/php check-task-status.php 2>&1 > /dev/null

一个更苛刻的定时任务

一个周期性定时任务,需要满足:

  • 服务挂了,需要立刻自动重启服务。
  • 任何时刻,服务进程只能存活一个。
* * * * * flock -xn task.lock -c 'while :; do flock -xn thread.lock -c "/bin/php script.php"; sleep 1; done' 2>&1 > /dev/null

利用 flock 锁和 shell 循环,巧妙地实现了一个智能的定时任务。