美文网首页
使用shell脚本运行java程序

使用shell脚本运行java程序

作者: PigPIgAutumn | 来源:发表于2018-02-05 15:42 被阅读0次
(题外话: 其实我也是刚学怎么编写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

相关文章

  • arthas源码解析

    1.运行脚本 下载as shell脚本 选择个java 进程后shell脚本会去运行个java程序 同时带上了进程...

  • 使用shell脚本运行java程序

    (题外话: 其实我也是刚学怎么编写shell脚本,可能写得有不好的地方,多多见谅) 平时我们编写完java程序后,...

  • 编写shell脚本运行python文件

    说明:第一次使用mac编写shell脚本,查看了很多网上资料大多是,直接使用编写脚本程序运行,而我想使用shell...

  • APUE读书笔记-19伪终端(14)

    (4)script程序 使用pty程序,我们可以如下通过shell脚本执行script程序: 当我们运行这个she...

  • [转]Shell 脚本如何传递 SIGTERM 信号给子程序

    假如你写了个 shell 脚本,来运行目标程序,比如 java,然后再用 supervisor 来配置启动这个 s...

  • Shell环境变量

    bash shell中使用环境变量在内存中存储有关shell会话和工作环境的数据。以便程序或shell中运行的脚本...

  • Java执行Shell & VB脚本

    有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本。而Runtime.getRuntim...

  • shell脚本基础

    shell 脚本开头部分的 #! 是告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。运行 Sh...

  • 2016.9.7 AM [shell的使用]

    0。运行shell脚本程序 1.增加1.sh的执行权限:chmod +x 1.sh执行shell脚本:./1....

  • 脚本启动akka程序

    使用shell脚本启动akka程序,参考于GearPump项目 准备工作:便于测试修改,直接运行编译出的class...

网友评论

      本文标题:使用shell脚本运行java程序

      本文链接:https://www.haomeiwen.com/subject/mgvbzxtx.html