本文章如果对你有所帮助,请不要吝啬您的赞,这是对我学习的一种支持,谢谢您的支持!!
一、crontab使用
1.安装crontab
一般 CentOS 会默认安装了 crontab
,执行下面命令,查看是否安装:
rpm -qa | grep crontab
如果查询结果类似于下面,说明已安装:
crontabs-1.11-6.20121102git.el7.noarch
如果结果为空,说明没有安装,执行下面命令进行安装即可:
yum install -y crontabs
2.crontab常用命令
查看 crontab
运行状态:
systemctl status crond
设置 crontab
开机自启:
systemctl enable crond
启动 crontab
:
systemctl start crond
查看当前用户的定时任务:
crontab -l
//查看root用户的crontab任务
crontab -u root -l
编辑当前用户的定时任务:
crontab -e
CentOS7上的cron命令
systemctl start crond.service //启动服务
systemctl stop crond.service //关闭服务
systemctl restart crond.service //重启服务
systemctl reload crond.service //重新载入配置
systemctl status crond.service //查看状态
注意!!第一次使用crontab时会报以下错误:
crontab: "/usr/bin/vi" exited with status 1
原因是vi编辑器的问题,比较简单的解决办法是直接执行
EDITOR=vim crontab -e
然后按i插入数据,保存退出即可,下次编辑直接用
crontab -e
二、设置定时任务
这里我们以定时重启tomcat为例。
在 root
目录下创建一个 restarttomcat
文件夹:注意!!必须在root目录下创建,因为启动crontab是,它会去读取root目录下的定时任务
mkdir -p /root/restarttomcat
然后在 restarttomcat
文件夹 下创建一个脚本 cqtomcat.sh
:
vim /root/restarttomcat/cqtomcat.sh
按 i
进入编辑状态,粘贴下面内容:
#!/bin/bash
tomcatPath=/opt/module/apache-tomcat-9.0.67
binPath="$tomcatPath/bin"
echo "[info][$(date +'%F %H:%M:%S')]正在监控tomcat,路径:$tomcatPath"
echo "[info][$(date +'%F %H:%M:%S')]正在监控tomcat,路径:$tomcatPath bin路径:$binPath"
pid=`ps aux | grep "/opt/module/apache-tomcat-9.0.67/bin" | grep -v grep | grep -v retomcat | awk '{print $2}'`
echo "[info][$(date +'%F %H:%M:%S')]tomcat进程为:$pid"
if [ -n "$pid" ]; then
echo "[info][$(date +'%F %H:%M:%S')]tomcat进程为:$pid"
echo "[info][$(date +'%F %H:%M:%S')]tomcat已经启动,准备使用shutdown命令关闭..."
$binPath"/shutdown.sh"
sleep 2
pid=`ps aux | grep "/opt/module/apache-tomcat-9.0.67/bin" | grep -v grep | grep -v retomcat | awk '{print $2}'`
echo "[info][$(date +'%F %H:%M:%S')]tomcat进程为:$pid"
if [ -n "$pid" ]; then
echo "[info][$(date +'%F %H:%M:%S')]使用shutdown命令关闭失败,准备kill进程..."
kill -9 $pid
echo "[info][$(date +'%F %H:%M:%S')]kill进程完毕!"
sleep 1
else
echo "[info][$(date +'%F %H:%M:%S')]使用shutdown命令关闭成功!"
fi
else
echo "[info][$(date +'%F %H:%M:%S')]tomcat未启动!"
fi
echo "[info][$(date +'%F %H:%M:%S')]准备启动tomcat..."
$binPath"/startup.sh"
按 Esc
键,再输入 :wq
保存文件。
注意!!一定要赋予文件权限
要进入到文件所在文件夹,才能使用该命令进行赋权:cd /opt/module/apache-tomcat-9.0.67/bin
chmod 777 cqtomcat.sh
chmod 777 shutdown.sh
执行下面命令即可编辑当前用户的定时任务:
crontab -e
每天凌晨2:00重启一次tomcat,那么可以按下 i
进入编辑状态,粘贴下面内容:
00 02 * * * bash /root/restarttomcat/cqtomcat.sh
该语句其实是写在/var/spool/cron/root文件下的
然后通过 crontab -l
可查看到已保存的定时任务:
00 02 * * * bash /root/restarttomcat/cqtomcat.sh
crontab不执行原因
- 检查
crontab
服务是否正常 - 检查脚本路径是否绝对路径
- 检查脚本路径前是否添加了
bash
或/etc/profile;/bin/sh
如果以上都没问题,那就要通过日志查找问题所在了。
三、*定时任务描述语法
crontab中每一个定时任务的格式由6部分组成,分别是分钟、小时、天、月、星期以及命令,前5部分用来配置任务触发时机,中间使用空格隔开,如下:
minute hour day month dayofweek command
minute – 表示分钟,值的范围是从0到59的整数
hour – 表示小时,值的范围是从0到23的整数
day – 表示天,值的范围是从1到31的整数
month – 表示月,值的范围是从1到12的整数
dayofweek – 表示星期,值的范围是从0到6的整数 (0表示周日)
command – 需要执行的命令(shell命令路径 >> 打印日志路径 表示执行tomcat.sh脚本,并且把结果日志打印到shlo.txt中)
时间部分除了使用估计数字以外还可以配合星号(*),逗号(,),斜杠(/),横杠(-)组合来表示其他意义。
1. 星号(*)
表示任意值,比如:
30 01 * * * command #每天的1:30执行命令
2. 逗号(,)
表示指定的时间,比如:
30 01 1,10,20 * * command #每月的1号、10号、20号的1:30分执行命令
3. 斜杠(/)
表示每隔多长时间,比如:
* */2 * * * command #每个2小时执行一次命令
4. 横杠(-)
表示连续时间,比如:
* 1-7/1 * * * command #凌晨1点-7点之前每隔一小时执行一次命令
四、crontab日志所在地
定时任务无论执行是否成功,都会往/var/spool/mail/root文件里发一份报错日志。
其余的日志则都会在/var/log/cron给出
五、可能会出现的报错
1.如果查看/var/spool/mail/root有以下报错
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
则解决方案是;
在cqtomat.sh文件里,加上
export JAVA_HOME=/opt/module/jdk1.8.0_301
export JRE_HOME=$JAVA_HOME/jre
六、crontab定时任务无法执行
问题现象
rs.sh脚本可以单独执行,但定时计划任务:
00 02 * * * bash /root/restarttomcat/cqtomcat.sh
在特定时间并不执行,可能是下面几条原因造成的
1、检查脚本是否可以单独执行
/root/restarttomcat/cqtomcat.sh
2、给脚本授权
虽然前面已经提示过了,但避免读者看漏了,这里在补充一下。
chmod 777 cqtomcat.sh
3、检查服务器时间
date
用法
例子:系统时间设定成1996年6月10日的命令:
date -s 06/10/96
系统时间设定成下午1点12分0秒的命令:
date -s 13:12:00
4、重启crond定时任务服务
查看定时任务是否启动
ps -ef | grep crond