在UBuntu上部署項目的時候,我們往往通過一段shell來啟動程序,甚至是通過crontab定時任務來定時的調(diào)用java程序,但是很奇怪的一個問題就是,比如我寫了一個如下的shell腳本:
1
2
3
4
5
6
|
#!/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腳本沒有可執(zhí)行權(quán)限,通過ls -lrt /apps/service/mtk/checking/run.sh查看腳本是有可執(zhí)行,但是有執(zhí)行權(quán)限呀-rwxr-xr-x
2)既然單獨運行腳本沒問題,那會不會是定時的問題呢?于是寫了一個簡單的輸出的shell腳本通過定時也是沒問題的。說明還是腳本的問題。
后來上網(wǎng)查了下,想到可能是腳本中環(huán)境變量的原因,因為通過crontab運行腳本,是以root用戶,而不是當前用戶,于是cat /etc/profile查看環(huán)境變量,然后修改腳本如下:
分析可能原因:
1)是否當前用戶對此shell腳本沒有可執(zhí)行權(quán)限,通過ls -lrt /apps/service/mtk/checking/run.sh查看腳本是有可執(zhí)行,但是有執(zhí)行權(quán)限呀-rwxr-xr-x
2)既然單獨運行腳本沒問題,那會不會是定時的問題呢?于是寫了一個簡單的輸出的shell腳本通過定時也是沒問題的。說明還是腳本的問題。
后來上網(wǎng)查了下,想到可能是腳本中環(huán)境變量的原因,因為通過crontab運行腳本,是以root用戶,而不是當前用戶,于是cat /etc/profile查看環(huán)境變量,然后修改腳本如下:
1
2
3
4
5
6
7
8
|
#!/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顯示導出為用戶環(huán)境變量的環(huán)境變量
這樣crontab計劃任務就正常了。
修改參考:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#!/bin/sh # ----------------------------------------------------------------------------- # Start script for the CMGP BOSSCONTROL # # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $ # ----------------------------------------------------------------------------- #指定字符集 LANG=zh_CN.GBK export LANG RUN_HOME=. CLASSPATH=$CLASSPATH:$RUN_HOME /lib/checking .jar CLASSPATH=$CLASSPATH:$RUN_HOME /lib/ojdbc14 .jar CLASSPATH=$CLASSPATH:$RUN_HOME /lib/commons-dbutils-1 .1.jar CLASSPATH=$CLASSPATH:$RUN_HOME /lib/log4j-1 .2.14.jar CLASSPATH=$CLASSPATH:$RUN_HOME /lib/dom4j-1 .6.jar export CLASSPATH java com.**.checking.Checking_Start >> log.out & |
手動命令行運行該腳本的時候,可以正常運行java程序,但是使用crontab定時任務,貌似就不起效果了,很是郁悶哪,查原因哪,分析可能原因:
1)是否當前用戶對此shell腳本沒有可執(zhí)行權(quán)限,通過ls -lrt /apps/service/mtk/checking/run.sh查看腳本是有可執(zhí)行,但是有執(zhí)行權(quán)限呀-rwxr-xr-x
2)既然單獨運行腳本沒問題,那會不會是定時的問題呢?于是寫了一個簡單的輸出的shell腳本通過定時也是沒問題的。說明還是腳本的問題。
后來上網(wǎng)查了下,想到可能是腳本中環(huán)境變量的原因,因為通過crontab運行腳本,是以root用戶,而不是當前用戶,于是cat /etc/profile查看環(huán)境變量,然后修改腳本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/bin/sh # ----------------------------------------------------------------------------- # Start script for the CMGP BOSSCONTROL # # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $ # ----------------------------------------------------------------------------- export PATH= /apps/usr/java/jdk1 .5 /bin :$PATH export JAVA_HOME= /apps/usr/java/jdk1 .5 export JRE_HOME= /apps/usr/java/jdk1 .5 /jre export CLASSPATH= /apps/usr/java/jdk1 .5 /lib : /apps/usr/java/jdk1 .5 /jre/lib :$CLASSPATH RUN_HOME= /apps/service/checking CLASSPATH=$CLASSPATH$RUN_HOME /lib/checking .jar CLASSPATH=$CLASSPATH:$RUN_HOME /lib/ojdbc14 .jar CLASSPATH=$CLASSPATH:$RUN_HOME /lib/commons-dbutils-1 .1.jar CLASSPATH=$CLASSPATH:$RUN_HOME /lib/log4j-1 .2.14.jar CLASSPATH=$CLASSPATH:$RUN_HOME /lib/dom4j-1 .6.jar export CLASSPATH=$CLASSPATH java com.**.checking.Checking_Start >> log.out & |
export顯示導出為用戶環(huán)境變量的環(huán)境變量
以上這種jar包是通過eclipse工具export導出,不包含MANIFEST.MF文件,如果使用打包工具Ant,我們可以在打包默認的build.xml文件中設置Class-Path
將第三方jar包加入manifest.mf文件中,且指定程序主類
在build.xml中添加如下內(nèi)容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!-- create a property containing all .jar files, prefix lib/, and seperated with a space --> < pathconvert property = "libs.project" pathsep = " " > < mapper > < chainedmapper > <!-- remove absolute path --> < flattenmapper /> <!-- add lib/ prefix --> < globmapper from = "*" to = "lib/*" /> </ chainedmapper > </ mapper > < path > <!-- lib.home contains all jar files, in several subdirectories --> < fileset dir = "${lib.dir}" > < include name = "**/*.jar" /> </ fileset > </ path > </ pathconvert > |
另外,在create manifest文件時,加上:
1
2
3
4
|
<!-- 這樣就可以將第三方jar包加入 --> < attribute name = "Class-Path" value = "${libs.project}" /> <!-- 程序運行的主類 --> < attribute name = "Main-Class" value = "com.**.checking.Checking_Start " /> |
這樣運行ant,打成的jar包中MANIFEST.MF中內(nèi)容如下:
1
2
3
4
5
6
7
8
9
10
11
|
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.7.0 Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.) Implementation-Title: fee task Implementation-Version: 1.0 Implementation-Vendor: Aspire Main-Class: com.aspire.cmgp.flowcontrol.server.FlowControlServer Class-Path: lib/cmgp-util-1.0.1.jar lib/commons-codec-1.3.jar lib/comm ons-collections.jar lib/commons-dbcp-1.2.1.jar lib/commons-httpclient .jar lib/commons-logging.jar lib/commons-pool-1.2.jar lib/dom4j.jar l ib/log4j.jar lib/ojdbc14.jar |
這樣在shell腳本中就不需要指定程序所需要的jar包了,也就不存在環(huán)境變量設置的惱人問題。比較正規(guī)的也是這么操作的。
這樣在shell中就直接運行jar包就行了:java -jar 主程序.jar -Xmx1024m -Xms1024m -Xmn512m,
#!/bin/bash后追加
source /etc/profile
source ~/.bash_profile
測試下。。
1
2
3
4
5
6
7
|
#! /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方法所在的類名
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/hanlong/p/5761595.html