Linux 临时环境变量的“坑”

       先描述一下当时头疼的问题:服务器端有三个服务是使用shell脚本启动,而出现问题的就是batch的脚本。batch脚本启动后一切功能运行正常,但有时就会出现“NoClassFounder”的异常,刚开始以为是打包的问题,于是将服务器上的代码拿下来检查,我就日了什么,对应的Class是存在的啊!可是为什么不生效,但当时也不知是什么原因,解决办法就是重启batch的shell脚本。

#!/bin/ksh
APPID=`basename $0 .sh`
STAMP=`date +%Y%m%d%H%M%S`

echo ============================
echo Loading Jars ...
echo ============================
(
cat batchenv.ini
cat basenv.ini
//g;/^$/d;' |^#" | sed 's/^[   ]*//g;s/[   ]*//g;s/
awk 'BEGIN{classpath="."}{ 
    if (NF == 0) next
    if (classpath != "") classpath=classpath":"$1 
    else classpath=$1
}END{print classpath}' | read CLASSPATH _x
export CLASSPATH

if [ -z "${JAVA_OPTS}" ]; then
    JAVA_OPTS="-Xms256m -Xmx1024m -XX:MaxPermSize=256M"
fi
export JAVA_OPTS

echo ============================
echo Start Batch Service
echo ============================
#echo java ${JAVA_OPTS} -classpath ${CLASSPATH} com.afcat.cbs.is.batch.launch.BatchLauncher
(
echo ${CLASSPATH}
echo ${JAVA_OPTS}
java ${JAVA_OPTS} ${JAVA_DUMPOPTS} com.afcat.cbs.is.batch.launch.BatchLauncher 2>&1
) | tee log/${APPID}_${STAMP}.log &

       可是为什么重启就又能加载到那个Class了呢?后来在一篇博客中看到这样的内容:

  • 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】 在shell的命令行下直接使用[export
    变量名=变量值] 定义变量,

    该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,

    shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

       回过来一看我的启动脚本中果然直接export了环境变量,并且还不是声明在.bachrc文件中的,按照上面的说法,不再使用临时的环境变量,转而直接将所有的jar打包在一起,用Java -jar启动,果然奏效了,再也没有出现过“NoClassFounder”的问题!下面是修改后的batch脚本。

#!/bin/ksh
APPID=`basename $0 .sh`
STAMP=`date +%Y%m%d%H%M%S`

echo ============================
echo Loading Jars ...
echo ============================
if [ -z "${JAVA_OPTS}" ]; then
    JAVA_OPTS="-Xms256m -Xmx1024m -XX:MaxPermSize=256M"
fi
export JAVA_OPTS
JAVA_OPTS="${JAVA_OPTS} -Dlogback.FilePath=$HOME/ccbs-lib -DCBS_PRO=$HOME/properties"

echo ============================
echo Start Batch Service
echo ============================
#echo java ${JAVA_OPTS} -classpath ${CLASSPATH} com.afcat.cbs.is.batch.launch.BatchLauncher
(
echo ${CLASSPATH}
echo ${JAVA_OPTS}
#java ${JAVA_OPTS} ${JAVA_DUMPOPTS} com.afcat.cbs.is.batch.launch.BatchLauncher 2>&1
#) | tee log/${APPID}_${STAMP}.log &
#nohup java ${JAVA_OPTS}  com.afcat.cbs.is.batch.launch.BatchLauncher >log/${APPID}_${STAMP}.log  2>&1 &
#tail -f log/${APPID}_${STAMP}.log
nohup java ${JAVA_OPTS} -jar lib/com.afcat.cbs.is.batch.jar >log/${APPID}_${STAMP}.log &
)

       总结一下“NoClassFounder”时不时出现情况的原因:当batch脚本启动后,如果之后再次启动其他的两个脚本,batch脚本的临时变量便会失效,CLASSPATH所加载的jar包也便会全部失效,就会出现上面的异常,但如果重启batch脚本,就会恢复正常,这是因为重新加载了CLASSPATH变量,jar也同时加载生效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值