问题引入:公司有一个jar包在服务器上跑着,这个项目每过一段时间就会内存飚高,使用arthas也没分析出哪里的问题(本人技术有限),想了个笨方法,每天晚上12点将这个项目kill掉,然后重新启动,这样就不会内存飚高了,结果发现crontab执行的shell脚本时不能执行java这个指令。
问题很好解决,你认真看完我写的,如果解决不了,作者立马倒立洗头
出现的问题:使用crontab,执行一个shell脚本,shell脚本里面的内容是 java -jar 或者是 java HelloWorld 这样的指令,通过crontab -e 指定了执行的时间,但是到了时间java程序没有执行。但是直接使用 sh test.sh 执行这个脚本的时候,就可以执行里面的java -jar 或者是 java HelloWorld
问题原因:当使用定时任务执行的时候,不会用到linux中的环境变量,而是会使用自己的环境变量。所以我们需要在shell文件中配置一下java的环境变量
问题解决步骤
- 首先通过echo查看linux中配置的Java环境变量
echo ${JAVA_HOME}
这是我配置的环境变量。
- 在shell 脚本中 写入环境变量
#!/bin/bash
# 配置java环境变量
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.aarch64
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME
export PATH
# 自己的业务代码
# 这里就是将java的版本信息输出到 data.log 中
nohup java -version >> data.log 2>&1
cd /root/shell
# 这里就是简单的将HelloWorld.class这个java文件执行了一遍,并将结果输出到data.log中
nohup java HelloWorld >> data.log 2>&1 || echo "Execution failed at $(date)" >> data.log
上述代码中 最重要的是 JAVA_HOME 这个变量,将这个变量的值替换成 你使用
echo "${JAVA_HOME}"
的值即可,然后将
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME
export PATH
这三行复制进去
下面关键的来了,最好不要使用绝对路径
使用 cd /自己的工作目录
然后再执行java -jar 或者是 java 指令
OK!
- 调试
49 22 * * * /root/shell/test.sh >> /root/shell/data.log 2>&1
如果以上的办法都不能解决你的困扰,请使用date
命令看一看你的linux上的时间是否同步
同步时间指令
ntpdate ntp.aliyun.com
如果解决了您的困扰,点个赞吧,让更多人看到,作者也是被这个困扰了一下午。