java运行shell脚本

1/9/2023 Linux

[toc]

# java运行shell脚本

使用场景:

  • 用shell脚本,快速运行,停止,重启jar包。
  • 用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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
Last Updated: 8/11/2023, 4:34:39 PM