Linux定时器之crontab命令格式配置
命令还算经常用,只是时间格式有时候没记住,这里笔录一下吧。
crontab -l 列出crontab文件
crontab -e 编辑
注意: %在crontab中被认为是newline,要用\来escape才行;比如有"date +%Y%m%d",必须替换为"date +\%Y\%m\%d"
crontab -r 删除 如果不希望删除写好的crontab文件,在该crontab文件前添加#将该文件注释掉。
crontab中的输出配置:
crontab中经常配置运行脚本输出为:>/dev/null 2>&1,来避免crontab运行中有内容输出。
shell命令的结果可以通过‘> ’的形式来定义输出
/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1,上述中就表示也输出到空设备;
尤其要注意的定时时间的配置:
第1列分钟1~59
第2列小时1~23(0表示零点)
第3列日1~31
第4列月1~12
第5列星期0~6(0表示星期天)
crontab的格式:
分 时 日 月 星期 需要运行的命令
这有一些例子:
30 21 * * * rm /admin/logs/error.log
上面的例子表示每晚的21:30 删除指定日志
45 4 1,10,22 * * rm /admin/logs/error.log
上面的例子表示每月1、10、22日的4 : 45 删除指定日志
10 1 * * 6,0 rm /admin/logs/error.log
上面的例子表示每周六、周日的1 : 10 删除指定日志
0,30 18-23 * * * rm /admin/logs/error.log
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟 删除指定日志
0 23 * * 6 rm /admin/logs/error.log
上面的例子表示每星期六的11 : 00 pm 删除指定日志
0 */1 * * * rm /admin/logs/error.log
每一小时删除指定日志
* */1 * * * rm /admin/logs/error.log(相当于不限时间按最小粒度 * * * * * sh)
每分钟删除指定日志
0 23-7/1 * * * rm /admin/logs/error.log
晚上11点到早上7点之间,每隔一小时 删除指定日志
0 11 4 * mon-wed rm /admin/logs/error.log
每月的4号与每周一到周三的11点 删除指定日志
0 1 1 jan * rm /admin/logs/error.log
一月一号的1点 删除指定日志
注意:上面有个蓝色注意点,就是不同单位时间的关系。
比如每5分钟查看一下日志,我们可以这么写:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * /command
这样肯定是没有问题的,但是就写书写起来非常复杂,简化一下可以这么写:
0-55/5 * * * * /command
这样的写法已经简化了很多,大家还是觉得麻烦,那么可以这样写:
*/5 * * * * /command
这句就表示在0,5,10,15,20,25,30,35,40,45,50,55分钟的时候执行命令,即每隔5分钟执行命令。
注意:这里也有一个注意点(除号 / 的使用):
只有能够被整除的步长值才能表达与我们理解相一致确切的含义,对于分钟来说只有 */2,*/3,*/4,*/5,*/6,*/10,*/12,*/15,*/30,对于小时来说则只有*/2,*/3,*/4,*/6,*/8,*/12。
对于日期来说,如果使用*/5,则不能保证每5天执行一次,到月底的时候可能只执行1天、2天或3天后就停止了,这取决与大小月、平闰年。这是因为cron 是没有状态的,它不能够记录上次执行的是什么时间,只能根据当前的时间来判断是否需要执行。
而对于分钟位 */13 来说,表示在分钟这个范围内,即0-59分钟,任务会每13分钟执行一次。
即:0,13,26,39,52;之后再间隔8分钟,就会又重新执行新的一小时内的分钟定时间隔了。