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方法所在的類名


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM