1.简介
Crontab是一个用于设置周期性执行任务的工具,可以设置按照分钟、小时、天、周、月来执行。
周期性执行的任务称为Cron Job,周期性执行的任务列表称为Cron Table。
可以在命令行终端通过执行crontab -l或者service crond status命令来查看Crontab是否正常按照和启动。如下图所示显示服务器的Crontab服务已经处于运行状态,对于root用户来说还没有需要执行的计划任务。
通过一个简单示例来演示一下如何使用Crontab:*/1 * * * * date >> /tmp/date.log,每分钟输出当前时间到/tmp/date.log文件中。
第一步:执行命令crontab -e
第二步:按下字母i键进入插入状态,输入*/1 * * * * date >> /tmp/date.log
第三部:按下Esc键退出插入状态,输入:wq,保存并退出,此时定时任务设置完成
第四部:执行命令tail -f /tmp/date.log,查看文件内容是否是一分钟增加一行当前时间。确认后Ctrl + c退出即可。
所以,总结一句话就是Linux计划任务服务crond利用crontab工具来修改相关配置文件,从而实现定时任务。
2.实践
配置格式说明
案例说明 :星号表示任何时间都匹配,逗号表示匹配几个固定时间,减号表示匹配时间段,斜线表示每隔一段时间
每天晚上23:30重启apache服务:30 23 * * * service httpd restart
每月1日、10日、20日的晚上23:30重启apache服务:30 23 1,10,20 * * service httpd restart
每月1日至10日的晚上23:30重启apache服务:30 23 1-10 * * service httpd restart
每隔2分钟重启apache服务:*/2 * * * * service httpd restart、1-59/2 * * * * service httpd restart
每天晚上23点到次日7点,每隔1小时重启apache服务:0 23-7/1 * * * service httpd restart
每天晚上18点到23点,每隔30分钟重启apache服务:0,30 18-23 * * * service httpd restart
crontab命令说明
-u:指定查看或者编辑哪个用户的计划任务,不指定用户时默认为当前登录用户
-e:编辑计划任务的配置文件
-l:列出配置文件中的计划任务列表
案例说明:
第一步:使用crontab -u root -e给root用户增加计划任务:1-59/2 * * * * echo "root's crontab execute..."
第二步:使用crontab -u test -e给test用户增加计划任务:0-58/2 * * * * echo "test's crontab execute..."
第三步:使用tail -f /var/log/cron查看计划任务的执行历史
配置文件说明
全局配置文件:/etc/crontab,通过查看其内容发现其命令格式中多了一个指定用户的地方。
还有一些与该文件作用类似的配置文件:
我们可以观察/var/log/cron文件中的日志内容:
而通过crontab -e修改的内容并没有在上面的配置文件中保存,那在哪里呢?/var/spool/cron/。
3.常见错误
环境变量:通过expor设置的环境变量是不能够直接在计划任务中直接使用的。
命令行双引号中使用百分号%时,未加反斜线\
第三个和第五个域是“或”的的关系,即配置分钟、小时、日、月、星期几中的日和星期几是或者的关系,不是并且的关系。
如:每月第一个星期日早晨1:59执行脚本test.sh
错误的写法:59 1 1-7 * 0 /root/test.sh
正确的写法:59 1 1-7 * * test `date + \%w` -eq 0 && /root/test.sh
分析:错误的写法错误的原因在于1-7解析为每月的1日到7日,星号后面的0代表周日,由于两者是或者的关系,所以真正表达的含义是每月的1日到7日或者是周日的1:59执行脚本。
分钟设置误用
在使用其他单位进行设定周期时,分钟不要设置为星号*,要设置为0。
补充:如何通过crontab实现以秒为单位的计划任务?
例:执行命令:date;sleep 0.5s;date,多次执行后可以感觉到两个date命令之间会有一段时间间隔
所以我们可以通过sleep与crontab结合的方式实现以秒为单位的计划任务。
*/1 * * * * echo "start"
*/1 * * * * sleep 30s;echo "start..."
分析以上两个计划任务,目的都是每分钟输出字符串“start...”,但是由于第二个计划任务在输出字符串之前先sleep30秒,这样就和第一个计划任务隔开了30秒的时间,但是实现了统一计划任务的以秒为单位来执行的目的。
来源:oschina
链接:https://my.oschina.net/u/2321626/blog/637222