ZT文萃

          本博不原創,轉帖自己感興趣那些事人物,什么入眼貼什么,隨心所欲。
          posts - 93, comments - 5, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          shell腳本運行java程序

          Posted on 2014-02-20 11:25 ZT文萃 閱讀(642) 評論(0)  編輯  收藏
          轉載自:
          http://blog.csdn.net/haoren_e/article/details/6043645


               在linux上部署項目的時候,我們往往通過一段shell來啟動程序,甚至是通過crontab定時任務來定時的調用java程序,但是很奇怪的一個問題就是,比如我寫了一個如下的shell腳本:

           

          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文件時,加上:

          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中內容如下:

          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,多好多方便~


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 巴青县| 东兰县| 荥阳市| 兰西县| 昆山市| 新河县| 江油市| 元阳县| 常山县| 白河县| 出国| 延寿县| 普定县| 米林县| 房产| 河北省| 固镇县| 虞城县| 信丰县| 额尔古纳市| 拉萨市| 高尔夫| 河源市| 绥化市| 突泉县| 鸡东县| 广宗县| 榕江县| 来安县| 贡嘎县| 鄢陵县| 宣化县| 新干县| 博湖县| 安丘市| 额敏县| 安吉县| 怀集县| 新营市| 永济市| 安乡县|