Skip to content
🗂️ 文章分类: 系统  
🏷️ 文章标签: Linux  
📝 文章创建时间: 2023-01-09
🔥 文章最后更新时间:暂无

[toc]

java运行shell脚本

使用场景:

  • 用shell脚本,快速运行,停止,重启jar包。
  • 用shell脚本,快速查询当天的日志。
shell
#!/bin/sh   
# 指此脚本使用/bin/sh来解释执行

# 该脚本为Linux下启动java程序的脚本
# 特别注意:
# 该脚本使用系统kill命令来强制终止指定的java程序进程。
# 所以在杀死进程前,可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本,
# 
# 根据实际情况来修改以下配置信息 ##################################

# JAVA应用程序的名称
APP_NAME=xxxx
# jar包存放路径
JAR_PATH='/home/elec-prcs'
# jar包名称
JAR_NAME=xxxx-0.0.1-SNAPSHOT.jar

# ######### Shell脚本中$0、$?、$!、$$、$*、$#、$@等的说明 #########

# $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
# $! Shell最后运行的后台Process的PID(即后台运行的最后一个进程的进程ID号)
# $? 最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (函数的返回值可以通过$?来获得)
# $- 显示shell使用的当前选项,与set命令功能相同
# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
# $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
# $# 添加到Shell的参数个数
# $0 Shell本身的文件名
# $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

# kill与kill -9的区别: 
  # kill默认是kill -15。kill -15命令告诉进程,请自行停止运行并退出,会给目标进程一个清理善后工作的机会。
  # kill -9命令告诉进程,请立刻退出。kill -9 可能会留下一些不完整的文件或状态,从而影响服务的再次启动。


# 检查程序是否处于运行状态。并返回程序进程对应的pid
isRun() {
  # 查询出对应名称服务的进程id,(添加 -v grep是为了避免匹配到 grep 进程)
  pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}' `
  # [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
  # [ -z STRING ] 表示:如果STRING的长度为零则返回为真。即变量pid为空是真
  # 如果存在进程id返回进程id,不存在进程id返回0。
  if [ -z "$pid" ]; 
  then
    return 0
  else
    return $pid
  fi
}


# 服务运行状态查看方法
status() {
  isRun
  # 此处的$?获取的是isRun方法的返回值。0表示没有进程pid,否则有进程pid
  if [ $? -ne "0" ]; 
  then
    echo "$APP_NAME is running......, pid is $pid"
  else
    echo "$APP_NAME is not running!"
  fi
}

# 服务启动方法
start() {
  isRun
  if [ $? -ne "0" ]; 
  then
    echo "$APP_NAME is already running....., pid is $pid"
  else
    echo "begin run $APP_NAME ....."
    # java -jar启动脚本
    # /dev/null指向一个黑洞目录,使得nohup命令不打印本地日志。从而使用jar包中logback的日志配置
    nohup java -jar $JAR_PATH/$JAR_NAME > /dev/null 2>&1 &
    # 输出日志
    echo "$APP_NAME is run success。pid is $!"
  fi
}

# 服务停止方法
stop() {
    # 判断服务进程是否存在
    isRun
    if [ $? -ne "0" ]; 
    then
        echo "begin stop ${APP_NAME}。pid is $pid"
        # 若服务进程存在,kill有时停止进程太慢或者无法停止进程
        kill $pid
        sleep 3

        # 再次判断进程是否存在
        isRun
        if [ $? -ne "0" ];
        then
            echo "Failed to stop ${APP_NAME} , begin force stop ${APP_NAME}, pid is $pid"
            kill -9 $pid
            sleep 3
            echo "$APP_NAME force stop success!" 
        else
            echo "$APP_NAME is stop success!"
        fi
    else
        echo "$APP_NAME is not running!"
    fi
    
}

# 重启服务方法
restart() {
  # 调用服务停止命令
  stop
  # 调用服务启动命令
  start
}

# 展示当天的日志
showlog() {
  today=$(date -d "now" +"%Y-%m-%d")
  tail -100f "elec-prcs-log.${today}.0.log"
}

# 帮助说明,用于提示输入参数信息
usage() {
    echo "用法: sh xxx.sh [ status | start | stop | restart | showlog ]"
    exit 1
}

###################################
# 读取脚本的第一个参数($1),进行判断
# 参数取值范围:{ status | start | stop | restart }
# 如参数不在指定范围之内,则打印帮助信息
###################################
#根据输入参数,选择执行对应方法,其他任何输入参数,都执行帮助说明方法
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
'status')
status
;;
'showlog')
showlog
;;
*)
usage
;;
esac
exit 0

Released under the MIT License.