Linux定时器之crontab命令格式配置

YaoGUET 2017-02-22

命令还算经常用,只是时间格式有时候没记住,这里笔录一下吧。

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分钟,就会又重新执行新的一小时内的分钟定时间隔了。

相关推荐