• shell脚本运行java程序jar


    在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本:

    #!/bin/sh
    export mypath=/root/project/wishnomal

    java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypath/wish2-assembly-1.0.0.jar newstandard.CrawlerNewStandard $*

    echo "END"

    手动命令行运行该脚本的时候,可以正常运行java程序,但是使用crontab定时任务,貌似就不起效果了

    分析可能原因:

     1)是否当前用户对此shell脚本没有可执行权限,通过ls -lrt /apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x

     2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。

    后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat /etc/profile查看环境变量,然后修改脚本如下:

    分析可能原因:

     1)是否当前用户对此shell脚本没有可执行权限,通过ls -lrt /apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x

     2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。

    后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat /etc/profile查看环境变量,然后修改脚本如下:

    #!/bin/sh
    export mypath=/root/project/wishnomal
    export JAVA_HOME=/root/lib/jdk1.7.0_72
    PATH=$PATH:$JAVA_HOME/bin

    java -Xmx3000m -Xms3000m -server -d64 -Dfile.encoding=UTF-8 -Dfetch.threads=300 -classpath $mypath/:$mypath/wish2-assembly-1.0.0.jar newstandard.CrawlerNewStandard $*

    echo "END"

    export显示导出为用户环境变量的环境变量 

    这样crontab计划任务就正常了。

    修改参考:http://blog.csdn.net/haoren_e/article/details/6043645

    1. #!/bin/sh  
    2. # -----------------------------------------------------------------------------  
    3. # Start script for the CMGP BOSSCONTROL   
    4. #  
    5. # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $  
    6. # -----------------------------------------------------------------------------  
    7. #指定字符集  
    8. LANG=zh_CN.GBK export LANG  
    9. RUN_HOME=.  
    10. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/checking.jar  
    11. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar  
    12. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar  
    13. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar  
    14. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar  
    15.   
    16. export CLASSPATH  
    17.   
    18. java  com.**.checking.Checking_Start >> log.out &   

     

    手动命令行运行该脚本的时候,可以正常运行java程序,但是使用crontab定时任务,貌似就不起效果了,很是郁闷哪,查原因哪,分析可能原因:

     1)是否当前用户对此shell脚本没有可执行权限,通过ls -lrt /apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x

     2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。

    后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat /etc/profile查看环境变量,然后修改脚本如下:

    1. #!/bin/sh  
    2. # -----------------------------------------------------------------------------  
    3. # Start script for the CMGP BOSSCONTROL   
    4. #  
    5. # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $  
    6. # -----------------------------------------------------------------------------  
    7. export PATH=/apps/usr/java/jdk1.5/bin:$PATH  
    8. export JAVA_HOME=/apps/usr/java/jdk1.5  
    9. export JRE_HOME=/apps/usr/java/jdk1.5/jre  
    10. export CLASSPATH=/apps/usr/java/jdk1.5/lib:/apps/usr/java/jdk1.5/jre/lib:$CLASSPATH  
    11. RUN_HOME=/apps/service/checking  
    12. CLASSPATH=$CLASSPATH$RUN_HOME/lib/checking.jar  
    13. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar  
    14. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar  
    15. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar  
    16.  CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar  
    17.   
    18. export CLASSPATH=$CLASSPATH  
    19.   
    20. java  com.**.checking.Checking_Start >> log.out &   

    export显示导出为用户环境变量的环境变量 
    以上这种jar包是通过eclipse工具export导出,不包含MANIFEST.MF文件,如果使用打包工具Ant,我们可以在打包默认的build.xml文件中设置Class-Path
    将第三方jar包加入manifest.mf文件中,且指定程序主类
    在build.xml中添加如下内容:

    1. <!-- create a property containing all .jar files, prefix lib/, and seperated with a space -->  
    2. <pathconvert property="libs.project" pathsep=" ">  
    3.    <mapper>  
    4.       <chainedmapper>  
    5.         <!-- remove absolute path -->  
    6.         <flattenmapper />  
    7.        <!-- add lib/ prefix -->  
    8.        <globmapper from="*" to="lib/*" />  
    9.       </chainedmapper>  
    10.     </mapper>  
    11.      <path>  
    12.       <!-- lib.home contains all jar files, in several subdirectories -->  
    13.       <fileset dir="${lib.dir}">  
    14.        <include name="**/*.jar" />  
    15.       </fileset>  
    16.      </path>  
    17.   </pathconvert>  

    另外,在create manifest文件时,加上:

    [java] view plain copy
     
    1. <!-- 这样就可以将第三方jar包加入 -->   
    2. <attribute name="Class-Path" value="${libs.project}" />  
    3. <!-- 程序运行的主类 -->  
    4. <attribute name="Main-Class" value="com.**.checking.Checking_Start " />  

    这样运行ant,打成的jar包中MANIFEST.MF中内容如下:

    [css] view plain copy
     
    1. Manifest-Version: 1.0  
    2. Ant-Version: Apache Ant 1.7.0  
    3. Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.)  
    4. Implementation-Title: fee task  
    5. Implementation-Version: 1.0  
    6. Implementation-Vendor: Aspire  
    7. Main-Class: com.aspire.cmgp.flowcontrol.server.FlowControlServer  
    8. Class-Path: lib/cmgp-util-1.0.1.jar lib/commons-codec-1.3.jar lib/comm  
    9.  ons-collections.jar lib/commons-dbcp-1.2.1.jar lib/commons-httpclient  
    10.  .jar lib/commons-logging.jar lib/commons-pool-1.2.jar lib/dom4j.jar l  
    11.  ib/log4j.jar lib/ojdbc14.jar  

    这样在shell脚本中就不需要指定程序所需要的jar包了,也就不存在环境变量设置的恼人问题。比较正规的也是这么操作的。
    这样在shell中就直接运行jar包就行了:java -jar 主程序.jar -Xmx1024m -Xms1024m -Xmn512m,

    ########

    #!/bin/bash后追加

    source /etc/profile
    source ~/.bash_profile

    测试下。。

    #! /bin/sh
    export JAVA_HOME=/usr/java/jdk1.6.0_18
    export CLASSPATH=.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
    for i in lib/*.jar; 
            do CLASSPATH=$i:${CLASSPATH} 
    done
    export CLASSPATH=.:${CLASSPATH}
    java -cp ${CLASSPATH} main方法所在包名.main方法所在的类名

  • 相关阅读:
    jstack 分析程序性能
    网关-zuul介绍 第一篇 网关解决的问题
    通过Fegin远程调用 ,返回JPA Page 对象报错
    css自定义字体
    CSS3选择器
    表格操作
    商品筛选条件
    多级菜单
    一排元素往下掉
    控制提示框不溢出父级盒子
  • 原文地址:https://www.cnblogs.com/hanlong/p/5761595.html
Copyright © 2020-2023  润新知