美文网首页
crontab定时任务重启java服务不执行,单独运行sh生效

crontab定时任务重启java服务不执行,单独运行sh生效

作者: 大风过岗 | 来源:发表于2021-01-06 10:34 被阅读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
    

    相关文章

      网友评论

          本文标题:crontab定时任务重启java服务不执行,单独运行sh生效

          本文链接:https://www.haomeiwen.com/subject/bnhnoktx.html