1、定时任务的场景
日常工作生活中,经常会有规定时间或按一定周期执行的任务或活动,比如每周一要开会,每月初要出统计报表,每隔一段时间要清除日志等。人难免有疏忽,对于计算机指令可完成的事情,通过计划定时任务可实现自动化执行,省心省力。
2、表达设计
表达一项定时任务,直接的想法当然就是如此:
时间约定 执行命令
时间约定:即定时,用于规定时间。这主要解决每周一,每月1号,每隔5分钟如何表述的问题,一种不错的定义详见表达式结构小节。
执行命令:要执行的任务,在系统中即为命令或脚本。
3、crontab 命令
Linux 系统提供了计划任务的 crontab 命令,相关服务默认是开启的,通过以下命令可以查看服务状态。
# ubuntu下
service cron status
# 其它或可能
service crond status
使用 crontab 命令可查看和编辑定时任务。
# 查看已配置的定时任务列表
crontab -l
# 编辑定时任务
crontab -e
配置内容,每行表达一项定时任务(#号开头表示注释)。
3.1、表达式结构
结构如下,一行中前面5节用于配置时间约定,之后就是要执行的命令。
几分 几时 几日 几月 周几 命令
如下图所示:
节 | 描述 |
---|---|
几分 | 表示分钟,取值范围 0 ~ 59。 |
几时 | 表示小时,取值范围 0 ~ 23。 |
几日 | 表示日期,取值范围 1 ~ 31。 |
几月 | 表示月份,取值范围 1 ~ 12。 |
周几 | 表示星期几,取值范围 0 ~ 7,0 和 7 都表示星期日。 |
除了直接设定为某个值,每节的时间还可按如下形式配置:
符号 | 描述 |
---|---|
* | 星号 * 代表所有可能的值,几分为 *,则表示每一分钟。 |
, | 逗号可以指定一个列表范围,如“1,3,5” |
- | 中杠号可以表示一个范围,如“2-6”表示“2,3,4,5,6” |
/ | 正斜线指定时间的间隔频率,几分为 */10,表示每十分钟。 |
3.2、实例
假设我们的任务是定期将时间写入一个日志文件,即命令如下。
echo $(date) >> /home/ubuntu/c.log
3.2.1 每分钟执行一次
* * * * * echo $(date) >> /home/ubuntu/c.log
3.2.2 每天8点到17点的第15和第45分钟执行
15,45 8-17 * * * echo $(date) >> /home/ubuntu/c.log
3.2.3 每周一上午8点30分钟执行
30 8 * * 1 echo $(date) >> /home/ubuntu/c.log
3.2.4 每月1、15日01:00执行
0 1 1,15 * * echo $(date) >> /home/ubuntu/c.log
3.2.5 每一小时执行一次
* */1 * * * echo $(date) >> /home/ubuntu/c.log
3.2.6 晚上11点到早上7点之间每隔一小时执行一次
* 23-7/1 * * * echo $(date) >> /home/ubuntu/c.log
4、秒级表达
由于这里的最小粒度为分钟,秒级表达的一种办法是让一分钟执行多次相同的任务,通过 sleep 延时的方式在1分钟内分片执行。
* * * * * command
* * * * * sleep 20; command
* * * * * sleep 40; command
5、踩坑
5.1 % 坑
当命令本身包含 % 时,需要加 \ 转义。
# 标准命令
echo $(date "+%Y-%m-%d %H:%M:%S")
# 表达式配置
* * * * * echo $(date "+\%Y-\%m-\%d \%H:\%M:\%S") >> /home/ubuntu/c.log
6、后话
拥有一台linux云服务器,则可以轻松的定义多个定时任务。而这个任务是什么呢?其实任务不一定要是同一台服务器上的,任何一个 URL 都可以看成是一项可执行的任务。
例如,一个统计数据通知的页 http://*domain.com/statnotify
,其功能是打开即向指定邮箱发送统计数据,则在任一服务器上定义如下定时任务都可达到每天自动执行的目的。
# 每天自动触发统计通知
* * */1 * * curl http://*domain.com/statnotify