crontab定时任务重启java服务不执行,单独运行sh生效
2021-01-06 本文已影响0人
大风过岗
场景描述
在centos 7上部署的java服务,有时会挂掉,为了能及时检测到服务运行状态以及及时拉起java服务,我们准备使用crontab写一个定时任务来定时检查服务的运行状态,并在挂掉时,重启java服务。
原始脚本
原始的脚本如下:
重启脚本
#!/bin/sh
jarDir="/data/publish/java"
jarName="java.jar"
logFile="/data/publish/java/autoRestart.log"
cd ${jarDir}
count=$(ps -ef | grep ${jarName} | grep -v "grep")
if [ -n "${count}" ];then
echo "`date` ${jarName} is alive" >> ${logFile}
else
echo "`date` ${jarName} is dead. restart it" >> ${logFile}
nohup java -jar java.jar > java.log 2>&1 &
fi
定时任务
[root@iZ8vb698vy6k1v3hf25feoZ ~]# crontab -l
* * */1 * * /data/publish/java/autoRestart.sh
[root@iZ8vb698vy6k1v3hf25feoZ ~]#
问题现象
在上面的定时任务中,我们设定为每一分钟执行一次,检查java服务的存活状态,并在挂掉时,重新拉起服务。但是我们发现当我们手动把服务挂掉时,服务在一分钟之后,并没有重启。
我们检查定时任务的执行日志:
[root@iZ8vb698vy6k1v3hf25feoZ ~]# tail -f /var/log/cron
Jan 6 10:17:01 iZ8vb698vy6k1v3hf25feoZ CROND[30233]: (root) CMD (/data/publish/java/autoRestart.sh)
Jan 6 10:18:01 iZ8vb698vy6k1v3hf25feoZ CROND[30635]: (root) CMD (/data/publish/java/autoRestart.sh)
Jan 6 10:19:01 iZ8vb698vy6k1v3hf25feoZ CROND[31040]: (root) CMD (/data/publish/java/autoRestart.sh)
Jan 6 10:20:01 iZ8vb698vy6k1v3hf25feoZ CROND[31106]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jan 6 10:20:01 iZ8vb698vy6k1v3hf25feoZ CROND[31107]: (root) CMD (/data/publish/java/autoRestart.sh)
Jan 6 10:21:01 iZ8vb698vy6k1v3hf25feoZ CROND[31176]: (root) CMD (/data/publish/java/autoRestart.sh)
Jan 6 10:22:01 iZ8vb698vy6k1v3hf25feoZ CROND[31241]: (root) CMD (/data/publish/java/autoRestart.sh)
可以看到定时任务是执行了的,只是重启命令没执行。
当我们进入到重启脚本的所在目录下,执行该脚本时,服务是可以被正确拉起的。
问题原因
问题的原因是,java的环境变量配置在定时任务中执行脚本时没生效。
环境配置在profile文件中的,我们可以在脚本中source下这个文件, 让其生效,或者把对应的配置写到脚本里面来。
source /etc/profile
问题修复
我们在脚本执行之前,source下profile文件,以使得在该脚本中可以使用配置的环境变量。
#!/bin/sh
source /etc/profile
jarDir="/data/publish/java"
jarName="java.jar"
logFile="/data/publish/java/autoRestart.log"
cd ${jarDir}
count=$(ps -ef | grep ${jarName} | grep -v "grep")
if [ -n "${count}" ];then
echo "`date` ${jarName} is alive" >> ${logFile}
else
echo "`date` ${jarName} is dead. restart it" >> ${logFile}
nohup java -jar java.jar > java.log 2>&1 &
fi