Crontab
crontab 是 Linux 系统自带的一个简单轻量的定时任务管理工具,相信做服务器端开发或运维的人员应该非常熟悉它。
crontab 只支持一些简单的任务定时处理方案,但配合一定的技巧方法,也能完成一些高级的定时任务需求。
基本的使用方法
crontab 配置的规则如下:
minute hour day month weekday command
- minute 分钟数设置,取值范围是0-59,示例:
- 指定分钟数:
0
或10
或0,15,30,45
。 - 指定分钟范围数:
1-15
或1-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 循环,巧妙地实现了一个智能的定时任务。