使用shell脚本运行java程序

(题外话: 其实我也是刚学怎么编写shell脚本,可能写得有不好的地方,多多见谅)

平时我们编写完java程序后,运行调试都是ide帮我们弄好的,但是实际情况肯定不会用ide运行,而是打包成jar,用命令行执行命令来运行程序,所以本着项目部署的方便,我就写了个shell脚本.

首先,来解释下这个shell脚本需要用到的知识:

首先是这行代码#!/bin/sh
这行代码表示这个脚本使用/bin/sh这个目录下的解释器来执行,即这个脚本就是我们常见的.sh脚本了

JAVAHOME=$JAVA_HOME
初始化jdk的环境变量,这需要linux系统配置好java环境

RUNNING_USER=$USER
跟上面一样,这个也是初始化执行该脚本的用户变量的,方便我们下面用shell执行控制台命令

BASEPATH=$(cd dirname $0; pwd)
获取项目根目录的绝对路径,防止项目迁移后又需要修改这个shell脚本

除了以上几行代码之外,其他函数我都写了注释,脚本比较简单,大家看注释就能明白了

#!/bin/sh
# radius server 运行脚本

# jdk路径
JAVAHOME=$JAVA_HOME

# 运行程序的用户
RUNNING_USER=$USER

# 项目根目录的绝对地址
BASEPATH=$(cd `dirname $0`; pwd)

# 程序路径,项目是用maven编译打包的,所以jar在target文件夹中,绝对路径在执行时构建,方便项目迁移
APP_HOME=$BASEPATH/target/radiusServer-1.0-SNAPSHOT-jar-with-dependencies.jar

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

#构建完整的classpath,除了main_class外,还需包含程序运行必须的依赖包
#因为项目是用maven打包的,所以依赖包会打包到target/lib目录下
CLASSPATH=$APP_HOME/classes
for i in $APP_HOME/lib/*.jar; do
    CLASSPATH="$CLASSPATH":"$i"
done

################################################################
# 判断程序是否已经启动,若已启动,则初始化全局psid(程序的id),方便下面停止程序时使用.
#
# psid: 全局变量,程序的在系统中的id
# jps: java的一个命令行工具,用于查找本机上正在运行的java程序及其pid
# grep: 正则表达式搜索命令
# awk: linux上的分割函数,分割后的结果中,$0表示整行,$1表示第一个字段,以此类推
#
################################################################

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
}

################################################################
# 启动程序
# 1.首先判断程序是否已经启动
# 2.已启动,则提示用户;未启动,则执行命令启动程序
# 3.最后输出启动启动程序的结果
#
# -ne: not equal
# nohup 其他命令 &: 让程序在后台运行的的命令,
# 其中,./program >/dev/null 表示将程序普通的输出流输出到dev目录下null文件中(该文件会自动清空,相当于黑洞),
# 2>log.out 表示将程序的异常及错误日志输出到/home/log.out这个文件中
# su - user -c commandline: 以user身份运行commandline这句命令
# &? 表示上一句命令或函数执行的结果
#
################################################################

start(){
    initPsid
    if [ ! -n "$1" ]; then
        echo "没有指定配置文件,使用默认配置文件..."
        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
}

################################################################
#
# 停止程序
# 执行kill pid来使程序退出
# kill命令默认是退出,非强制,服务端收到退出指令后将执行停止操作(如关闭线程池之类的),
# 执行完才算真正退出
#
################################################################

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
}

#################################################################
#
# 获取服务端程序是否正在运行
#
#################################################################

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

##################################################################
#
# 输出程序运行的环境
#
##################################################################

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 "*****************************************"
}

#################################################################
#
# 根据参数确定调用哪个函数
#
# 函数传递参数的方式: funcName param1 param2
# 在函数中获取参数的方式: $1 $2,第一个参数就是$1,第n个就是$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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • 一、什么是Shell脚本 示例 看个例子吧: 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 ...
    Rick617阅读 772评论 0 1
  • 作者:qinjx原文地址:Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: 示例解释 第1...
    IT程序狮阅读 2,328评论 1 67
  • 什么是Shell脚本 示例 看个例子吧: 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2...
    余歌_非鱼阅读 4,755评论 2 93
  • 今天晒了被子,又吃多了。但是每天都有好好在兼职和运动,但是因为每天都很无聊,吃很多,所以不知道会不会胖起来。 两人...
    鸡汤sheep阅读 274评论 0 0
  • 很小的时候,在苏北农村就知道江南水乡有个叫常熟的地方。那时我的四爷爷在常熟谋生,每年春节都会帮我买过年的新衣...
    烟雨江南秀阅读 557评论 0 0