使用shell腳本運(yùn)行java程序

(題外話: 其實(shí)我也是剛學(xué)怎么編寫shell腳本,可能寫得有不好的地方,多多見諒)

平時(shí)我們編寫完java程序后,運(yùn)行調(diào)試都是ide幫我們弄好的,但是實(shí)際情況肯定不會(huì)用ide運(yùn)行,而是打包成jar,用命令行執(zhí)行命令來運(yùn)行程序,所以本著項(xiàng)目部署的方便,我就寫了個(gè)shell腳本.

首先,來解釋下這個(gè)shell腳本需要用到的知識(shí):

首先是這行代碼#!/bin/sh
這行代碼表示這個(gè)腳本使用/bin/sh這個(gè)目錄下的解釋器來執(zhí)行,即這個(gè)腳本就是我們常見的.sh腳本了

JAVAHOME=$JAVA_HOME
初始化jdk的環(huán)境變量,這需要linux系統(tǒng)配置好java環(huán)境

RUNNING_USER=$USER
跟上面一樣,這個(gè)也是初始化執(zhí)行該腳本的用戶變量的,方便我們下面用shell執(zhí)行控制臺(tái)命令

BASEPATH=$(cd dirname $0; pwd)
獲取項(xiàng)目根目錄的絕對(duì)路徑,防止項(xiàng)目遷移后又需要修改這個(gè)shell腳本

除了以上幾行代碼之外,其他函數(shù)我都寫了注釋,腳本比較簡(jiǎn)單,大家看注釋就能明白了

#!/bin/sh
# radius server 運(yùn)行腳本

# jdk路徑
JAVAHOME=$JAVA_HOME

# 運(yùn)行程序的用戶
RUNNING_USER=$USER

# 項(xiàng)目根目錄的絕對(duì)地址
BASEPATH=$(cd `dirname $0`; pwd)

# 程序路徑,項(xiàng)目是用maven編譯打包的,所以jar在target文件夾中,絕對(duì)路徑在執(zhí)行時(shí)構(gòu)建,方便項(xiàng)目遷移
APP_HOME=$BASEPATH/target/radiusServer-1.0-SNAPSHOT-jar-with-dependencies.jar

# main方法類
MAIN_CLASS=your.main.class

#構(gòu)建完整的classpath,除了main_class外,還需包含程序運(yùn)行必須的依賴包
#因?yàn)轫?xiàng)目是用maven打包的,所以依賴包會(huì)打包到target/lib目錄下
CLASSPATH=$APP_HOME/classes
for i in $APP_HOME/lib/*.jar; do
    CLASSPATH="$CLASSPATH":"$i"
done

################################################################
# 判斷程序是否已經(jīng)啟動(dòng),若已啟動(dòng),則初始化全局psid(程序的id),方便下面停止程序時(shí)使用.
#
# psid: 全局變量,程序的在系統(tǒng)中的id
# jps: java的一個(gè)命令行工具,用于查找本機(jī)上正在運(yùn)行的java程序及其pid
# grep: 正則表達(dá)式搜索命令
# awk: linux上的分割函數(shù),分割后的結(jié)果中,$0表示整行,$1表示第一個(gè)字段,以此類推
#
################################################################

psid=0
initPsid(){
    javaps=`$JAVAHOME/bin/jps -l | grep $APP_HOME`
    
    if [ -n "$javaps" ]; then
        psid=`echo $javaps | awk '{ print $1}'`
    else
        psid=0
    fi
}

################################################################
# 啟動(dòng)程序
# 1.首先判斷程序是否已經(jīng)啟動(dòng)
# 2.已啟動(dòng),則提示用戶;未啟動(dòng),則執(zhí)行命令啟動(dòng)程序
# 3.最后輸出啟動(dòng)啟動(dòng)程序的結(jié)果
#
# -ne: not equal
# nohup 其他命令 &: 讓程序在后臺(tái)運(yùn)行的的命令,
# 其中,./program >/dev/null 表示將程序普通的輸出流輸出到dev目錄下null文件中(該文件會(huì)自動(dòng)清空,相當(dāng)于黑洞),
# 2>log.out 表示將程序的異常及錯(cuò)誤日志輸出到/home/log.out這個(gè)文件中
# su - user -c commandline: 以u(píng)ser身份運(yùn)行commandline這句命令
# &? 表示上一句命令或函數(shù)執(zhí)行的結(jié)果
#
################################################################

start(){
    initPsid
    if [ ! -n "$1" ]; then
        echo "沒有指定配置文件,使用默認(rèn)配置文件..."
        configPath=$BASEPATH/conf.json
    else
        echo "使用指定的配置文件: $1"
        configPath=$1
    fi

    if [ $psid -ne 0 ]; then
        echo "=================================================="
        echo "|         server has already started          |"
        echo "=================================================="
    else
        echo "starting $MAIN_CLASS ..."
        JAVA_CMD="nohup $JAVAHOME/bin/java -jar $APP_HOME -c $configPath ./program >log.out &"
        su - $RUNNING_USER -c "$JAVA_CMD"
        initPsid
        if [ $psid -ne 0 ]; then
            echo "start [OK] pid=$psid"
        else
            echo "start [FAILED], $?"
        fi
    fi
}

################################################################
#
# 停止程序
# 執(zhí)行kill pid來使程序退出
# kill命令默認(rèn)是退出,非強(qiáng)制,服務(wù)端收到退出指令后將執(zhí)行停止操作(如關(guān)閉線程池之類的),
# 執(zhí)行完才算真正退出
#
################################################################

stop(){
    initPsid

    if [ $psid -ne 0 ]; then
        echo -n "Stopping $MAIN_CLASS pid=$psid ..."
        su - $RUNNING_USER -c "kill $psid"
        if [ $? -eq 0 ]; then
            echo "Stop [OK]"
        else
            echo "Stop [FAILED]"
        fi
    else
        echo "=================================================="
        echo "|      WARN: $MAIN_CLASS is not running!      |"
        echo "=================================================="
    fi
}

#################################################################
#
# 獲取服務(wù)端程序是否正在運(yùn)行
#
#################################################################

status(){
    initPsid
    if [ $psid -ne 0 ]; then
        echo "Running"
    else
        echo "not Running"
    fi
}

##################################################################
#
# 輸出程序運(yùn)行的環(huán)境
#
##################################################################

info(){
    echo "********* System Information ***********"
    echo `head -n 1 /etc/issue`
    echo `uname -a`
    echo
    echo "JAVAHOME=$JAVAHOME"
    echo `$JAVAHOME/bin/java -version`
    echo
    echo "USER=$RUNNING_USER"
    echo "BASEPATH=$BASEPATH"
    echo "APP_HOME=$APP_HOME"
    echo "MAIN_CLASS=$MAIN_CLASS"
    echo "*****************************************"
}

#################################################################
#
# 根據(jù)參數(shù)確定調(diào)用哪個(gè)函數(shù)
#
# 函數(shù)傳遞參數(shù)的方式: funcName param1 param2
# 在函數(shù)中獲取參數(shù)的方式: $1 $2,第一個(gè)參數(shù)就是$1,第n個(gè)就是$n
#
#################################################################

case "$1" in
    'start')
        start $2
        ;;
    'stop')
        stop
        ;;
    'restart')
        stop
        start $2
        ;;
    'status')
        status
        ;;
    'info')
        info
        ;;
    *)

    echo "Usage $0 { start | stop | status | restart | info }"
    exit
esac
exit 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市懂昂,隨后出現(xiàn)的幾起案子蕉鸳,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潮尝,死亡現(xiàn)場(chǎng)離奇詭異榕吼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)勉失,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門羹蚣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乱凿,你說我怎么就攤上這事顽素。” “怎么了徒蟆?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵胁出,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我段审,道長(zhǎng)全蝶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任寺枉,我火速辦了婚禮抑淫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姥闪。我一直安慰自己始苇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布筐喳。 她就那樣靜靜地躺著催式,像睡著了一般。 火紅的嫁衣襯著肌膚如雪避归。 梳的紋絲不亂的頭發(fā)上荣月,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音槐脏,去河邊找鬼。 笑死撇寞,一個(gè)胖子當(dāng)著我的面吹牛顿天,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔑担,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牌废,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了啤握?” 一聲冷哼從身側(cè)響起鸟缕,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后懂从,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體授段,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年番甩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侵贵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缘薛,死狀恐怖窍育,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宴胧,我是刑警寧澤漱抓,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站恕齐,受9級(jí)特大地震影響乞娄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檐迟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一补胚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧追迟,春花似錦溶其、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廓块,卻和暖如春厢绝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背带猴。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工昔汉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拴清。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓靶病,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親口予。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娄周,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一、什么是Shell腳本 示例 看個(gè)例子吧: 示例解釋 第1行:指定腳本解釋器沪停,這里是用/bin/sh做解釋器的 ...
    Rick617閱讀 781評(píng)論 0 1
  • 作者:qinjx原文地址:Shell腳本編程30分鐘入門 什么是Shell腳本 示例 看個(gè)例子吧: 示例解釋 第1...
    IT程序獅閱讀 2,332評(píng)論 1 67
  • 什么是Shell腳本 示例 看個(gè)例子吧: 示例解釋 第1行:指定腳本解釋器煤辨,這里是用/bin/sh做解釋器的 第2...
    余歌_非魚閱讀 4,763評(píng)論 2 93
  • 今天曬了被子裳涛,又吃多了。但是每天都有好好在兼職和運(yùn)動(dòng)众辨,但是因?yàn)槊刻於己軣o聊端三,吃很多,所以不知道會(huì)不會(huì)胖起來泻轰。 兩人...
    雞湯sheep閱讀 280評(píng)論 0 0
  • 很小的時(shí)候浮声,在蘇北農(nóng)村就知道江南水鄉(xiāng)有個(gè)叫常熟的地方虚婿。那時(shí)我的四爺爺在常熟謀生,每年春節(jié)都會(huì)幫我買過年的新衣...
    煙雨江南秀閱讀 570評(píng)論 0 0