linux中的计划任务crontab
crontab:可以从定时重复工作中解脱出来
工作中遇到的困难
每分钟需要执行一个程序检查系统运行状态
每天凌晨需要对过去一天的业务数据进行统计
每个星期需要把日志文件备份
每个月需要把数据库进行备份
crontab 简介
用于设置周期性被执行的任务工具。
被周期性执行的任务我们称为Cron job
周期性执行的任务列表称为Cron Table
crontab 实践内容简介
相关工具
安装并检查crontab服务
crontab的基本组成
crontab的配置文件格式
crontab工具的使用
crontab 的日志
crontab 常见的错误
检查cron服务
检查crontab工具是否安装:crontab -l
检查crontab服务是否启动:service crond status
安装cron
yum install -y vixie-cron
yum install crontabs
案例
[root@xuexi-001 ~]# crontab -e
*/1 * * * * date >> /tmp/log.txt
# 每分钟都打印当前时间到log.txt 文件中
[root@xuexi-001 ~]# tail -f /tmp/log.txt
2018年 10月 05日 星期五 00:00:01 CST
2018年 10月 05日 星期五 00:01:01 CST
2018年 10月 05日 星期五 00:02:01 CST
# tail -f 显示文件的最后几行 ,tail -2 显示文件的最后两行
crontab 基本组成
crond 服务 --系统服务
配置文件 --以文件方式设置定时任务
配置工具 -- 用于调整定时任务
crontab 配置文件格式
* * * * * COMMAND
第一个 * :分钟 0-59
第二个 * :小时 0-23
第三个 * :日期 1-31
第四个 * :月份 1-12
第五个 * :星期 0-7(0或者7代表星期天)
案例
每晚的21:30重启apache
30 21 * * * service httpd restart
每月的1、10、22日的4:45重启apache
45 4 1,10,22 * * service httpd restart
每月的1到10日的4:45重启apache
45 4 1-10 * * service httpd restart
每隔两分钟重启apache
*/2 * * * * service httpd restart # 偶数分钟
1-59/2 * * * * service httpd restart # 奇数分钟
晚上11点到早上7点之间,每隔一小时重启apache
0 23-7/1 * * * service httpd restart
每天18:00到23:00之间每隔30分钟重启apahce
0,30 18-23 * * * service httpd restart
0-59/30 18-23 * * * service httpd restart
小结
* 表示任何时候都匹配
可用“A,B,C” 表示A或者B或者C时执行命令
可用“A-B”表示A-B之间时执行命令
可用“*/A” 表示A分钟(小时等)执行一次命令
crontab工具的使用
crontab 选项:
-u: define user
-e: edit user's crontab
-l: list user's crontab
-r: delete user's crontab
案例
1、给root 用户添加计划任务:每隔两分钟(奇数分钟)打印 “JISHU**********”
[root@xuexi-001 ~]# crontab -e
1-59/2 * * * * echo "JISHU***********************"
2、添加普通用户 crontester 并且添加计划任务:每隔两分钟(偶数分钟)打印“EVEN**************”
[root@xuexi-001 ~]# useradd crontester
[root@xuexi-001 ~]# crontab -e -u crontester
[root@xuexi-001 ~]# crontab -l -u crontester
0-58/2 * * * * echo "EVEN ************"
查看日志
[root@xuexi-001 ~]# tail -f /var/log/cron
Oct 5 00:51:01 xuexi-001 CROND[1906]: (root) CMD (echo "JISHU***********************")
Oct 5 00:52:01 xuexi-001 CROND[1911]: (crontester) CMD (echo "EVEN ************")
crontab 配置文件
全局(系统)配置文件
/etc/crontab
注意格式
crontab 日志
/var/log/cron 文件保存着cron的任务执行记录
[root@xuexi-001 ~]# cd /var/log/
您在 /var/spool/mail/root 中有新邮件
[root@xuexi-001 log]# ls cron*
cron cron-20180611 cron-20180926 cron-20181001
[root@xuexi-001 log]# ls -l cron*
-rw------- 1 root root 23564 10月 5 01:10 cron
-rw-------. 1 root root 10917 6月 11 21:08 cron-20180611
-rw-------. 1 root root 11543 9月 26 20:13 cron-20180926
-rw------- 1 root root 4043 10月 1 13:22 cron-20181001
[root@xuexi-001 log]# tail -f cron
Oct 5 01:04:01 xuexi-001 CROND[2001]: (crontester) CMD (echo "EVEN ************")
Oct 5 01:04:49 xuexi-001 crontab[2005]: (root) LIST (root)
Oct 5 01:04:49 xuexi-001 crontab[2005]: PAM pam_end: NULL pam handle passed
Oct 5 01:05:01 xuexi-001 CROND[2007]: (root) CMD (echo "JISHU***********************")
Oct 5 01:06:01 xuexi-001 CROND[2014]: (crontester) CMD (echo "EVEN ************")
Oct 5 01:07:01 xuexi-001 CROND[2020]: (root) CMD (echo "JISHU***********************")
Oct 5 01:08:01 xuexi-001 CROND[2026]: (crontester) CMD (echo "EVEN ************")
Oct 5 01:09:01 xuexi-001 CROND[2032]: (root) CMD (echo "JISHU***********************")
crontab 常见错误
环境变量
命令行双引号中使用%时,未加反斜线\
第三和第五个域之间执行的是“或”操作
分钟设置误用
第三和第五个域之间执行的是“或”操作
案例
四月的第一个星期日早晨1时59分钟运行a.sh
59 1 1-7 4 * test`date + \%w` -eq 0 && /root/a.sh
分钟设置误用
案例
两小时运行一次
错误示例:
* 0,2,4,6,8,10,12,14,16,18,20,22 * * * date
正确示例:
0 */2 * * * date
说明
在使用分钟的时候如果使用的分钟时使用 * 那么就是每两个小时的每分钟都会执行。正确的应该设置为 0,还有就是在使用分钟设置时,要注意分钟的约束,比如1-10/2,先满足1-10之间的每两分钟也就是1,3,5,7,9的时候执行,在11分钟的时候就不执行了。