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
上一篇下一篇

猜你喜欢

热点阅读