一、CronTab介绍
cronTab就是一个定时任务的工具,比如你有一个脚本,这个脚本是对日志进行切割的,如果我们想要每天0点对日志执行一次切割,人为执行脚本太过麻烦,毕竟每天都得执行一次;CronTab工具就是为我们解决这个麻烦的,他会按照指定的时间为我们启动指定的任务脚本。
案例应用:
- 每分钟需要执行一个脚本进行系统健康检查
- 每天凌晨对过去一天的系统数据进行统计
- 每周对系统日志进行备份切割
- 每个月对系统关键数据进行备份
二、安装
yum install -y cronie crontabs
三、验证服务是否安装
检查crond服务是否安装及启动:
yum list cronie && systemctl status crond
检查crontab工具是否安装:
yum list crontabs && which crontab && crontab -l
四、Crond服务启动、查看、关闭的命令
systemctl start crond # 启动 crond 服务
systemctl status crond # 查看 crond 服务的运行状态
systemctl stop crond # 关闭 crond 服务
systemctl restart crond # 重新启动 crond 服务
crontab -l // 列出所有定时任务
crontab -e // 进入定时任务的编辑文件
每次修改定时任务之后,都要去执行systemctl restart crond命令,以便重新加载定时任务列表。
五、文件格式
语法:[cron表达式] [命令或脚本]
cron表达式语法格式:
Linux下的Crontab表达式有五个域,分表表示:分钟、小时、日期、月、星期。
这篇文章有对cron表达式做详细的解释:https://zhangzw.com/posts/20190428.html
示例:
0 0 10,14,16 * * ?
:每天上午 10 点,下午 2 点,4 点
0 0/30 9-17 * * ?
:朝九晚五工作时间内每半小时
0 0 12 ? * WED
:表示每个星期三中午 12 点
六、crontab配置文件
系统配置文件
/etc/crontab
系统用户crontab配置文件保存目录(crontab -e)
crontab -e命令,其实调用的就是vi命令,所有的定时任务都保存在/var/spool/cron/目录下,即每个用户在第一次使用crontab -e命令时,/var/spool/cron/下都会有一个与当前用户名相同的文件生成,这个生成的文件就是用来存放定时任务的。
示例:
root用户:/var/spool/cron/root
user01用户:/var/spool/cron/user01
七、环境变量
如果我们想在crontab 的定时任务中使用一些第三方的命令或者工具,我们就需要将第三方命令或者工具的绝对路径添加到/etc/crontab的PATH变量中,比如在crontab定时任务中需要使用到java命令,就需要将java的bin路径添加到PATH变量中(注:这种方式添加第三方路径,只能将定时任务配置在/etc/crontab文件中),如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/soft/jdk1.8/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# 在/etc/crontab文件配置任务时,需要制定用户名
* * * * * root java -version 2> /home/test.txt
除了上面的直接在/etc/crontab的PATH变量中添加第三方命令或者工具的绝对路径之外,还可以使用如下方式使用第三方命令或者工具。
在执行具体任务前引入系统/用户环境变量(推荐使用这种方式)
自定义java环境变量/etc/profile.d/java.sh
# /etc/profile.d/java.sh
JAVA_HOME=/soft/jdk1.8
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib
export JAVA_HOME PATH CLASSPATH
配置定时任务时,先引入系统/用户环境变量,然后用分号隔开,在写定时任务
* * * * * source /etc/profile.d/java.sh;java -version 2> /home/test01.txt
修改完之后不要忘记执行:
systemctl restart crond
八、日志
crontab 的日志存放在/var/log/cron文件中。
九、定时分隔catalina.out日志
创建日志分隔脚本/soft/tomcat-api/logs/auto-deal-log.sh
#!/bin/bash
# 复制(备份)当前日志文件
cp /soft/tomcat-api/logs/catalina.out /soft/tomcat-api/logs/catalina_`date -d '-1 days' +%Y%m%d`.log
# 清空catalina.out日志文件
echo "" > /soft/tomcat-api/logs/catalina.out
# 删除7天之前的日志文件
find /soft/tomcat-api/logs/ -mtime +7 -name "*" -exec rm -rf {} \;
然后配置定时任务即可