前述

​ 一开始在网上参考了很多启动服务的脚本,但是我都不是很满意,因为基本都是要你自己修改脚本文件里面的某个变量来达到指定一个Jar包来启动。
​ 我觉得这很不合理,都使用脚本文件了,还要我们根据服务来改,实在是麻烦,明明搜索同级目录下的Jar包并不是很难的一件事情,但是却并没有人这样写。
​ 我猜可能大多数人都喜欢把很多Jar包放在同一个目录下了,其实这不是很好,单个服务还是要创建一个文件夹单独存放好一点,这样还可以更快的寻早到某一个服务的Jar包和日志。

参数版脚本文件

这是我初步写成的一个脚本文件,只要将该脚本文件和Jar包放入同一个目录下运行即可启动服务。

其实这个脚本文件多多少少还是有一点问题的,提示信息也不是很美观,毕竟只是初步写成的,后续还会慢慢完善的。

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
#!/bin/bash

# 文件夹路径
FOLDER_PATH=''
# 服务名称
SERVER_NAME=''
# jar包名称
JAR_NAME=''
# PID文件
PID_FILE=''
# java -jar的参数
OPTIONS=''
# log文件
LOG_FILE=''

# 使用说明
usage() {
echo "Usage: sh ****.sh [OPTION]... "
echo -e "\033[43;37m 注意: 需要添加参数运行,否则无法成功运行 \033[0m"
echo -e "\033[43;37m 注意: 需要将本sh文件和jar包放在同一个文件夹 \033[0m"
echo "当前OPTION参数有以下几种"
echo " --info 查看当前服务信息"
echo " --start 启动服务"
echo " --stop 停止服务"
echo " --restart 重启服务"
echo " --status 查询服务运行状态"
exit 1
}

# 初始化
init() {
FOLDER_PATH=$( pwd )
JAR_NAME=$( ls -l |grep .jar | awk '{print$9}' )
SERVER_NAME=$( basename ${JAR_NAME} .jar )
PID_FILE=${SERVER_NAME}\.pid
LOG_FILE=${SERVER_NAME}\.log
OPTIONS='-Xms256m -Xmx512m'
}

# 获取环境信息
info() {
echo "----------检测是否有Java环境----------"
if ! command -v java &> /dev/null
then
echo "-bash: java: command not found"
echo "请检查是安装了Java环境,是否配置了环境变量"
else
echo "----------当前Java的环境为----------"
echo ""
echo "$( java -version )"
fi
echo "----------当前文件夹路径----------"
echo "当前文件夹路径为${FOLDER_PATH}"
echo "----------启动服务的信息----------"
echo "当前服务名称为${SERVER_NAME}"
echo "需要启动的jar包名称为${JAR_NAME}"
echo "保存的PID文件名称为${PID_FILE}"
echo "保存的LOG文件名称为${LOG_FILE}"
echo "----------java -jar的参数----------"
echo "当前参数为${OPTIONS},需要更改请执行 -setOptions参数进行修改"
}

# 查询当前程序是否运行
is_running() {
pid=`ps -ef|grep $JAR_NAME | grep -v grep | awk '{print $2}' `
# pid是否存在,存在返回1,不存在返回0
if [ -n "${pid}" ]; then
return 1
else
return 0
fi
}

# 启动服务
start() {
is_running
# 如果服务没有运行,则启动服务,否则不启动
if [ $? -eq "0" ]; then
init
echo "服务启动中,请稍后"
nohup java ${OPTIONS} -jar ${JAR_NAME} >${LOG_FILE} 2>&1 &
echo $! > ${PID_FILE}
echo "服务启动成功,当前的PID为$( cat ${PID_FILE} )"
else
echo "目标服务正在运行,请勿再次启动"
fi
}

# 停止服务
stop() {
is_running
if [ $? -eq "0" ]; then
echo "没有检测到服务启动,请启动之后在尝试"
exit 2
fi
pid=$(cat ${PID_FILE})
kill ${pid}
rm -rf ${PID_FILE}
sleep 1
is_running
if [ $? -eq "1" ]; then
kill -9 ${pid}
fi
echo "成功结束${SERVER_NAME}的进程"
}

# 查询服务运行状态
status() {
is_running
if [ $? -eq "1" ]; then
echo "${SERVER_NAME}服务正在运行中,当前服务的PID为${pid}"
else
echo "${SERVER_NAME}服务没有在运行"
fi
exit 0
}

# 重启服务
restart() {
is_running
if [ $? -eq "1" ]; then
stop
start
else
echo "当前服务并没有运行,请运行之后在尝试"
fi
exit 0
}

init

case "$1" in
"--info")
info
;;
"--start")
start
;;
"--stop")
stop
;;
"--status")
status
;;
"--restart")
restart
;;
*)
usage
;;
esac

exit 0

以下是使用方法

1
2
3
4
5
6
7
8
9
10
11
12
# 获取当前服务信息
sh start.sh --info
# 启动服务
sh start.sh --start
# 停止服务
sh start.sh --stop
# 查询服务状态
sh start.sh --status
# 重启服务
sh start.sh --restart
# 提示使用信息
sh start

后续

后续可能还会继续优化,而且感觉用参数来使用还是麻烦了一点,之后可能会使用菜单,或者是光标来启动吧,真要说哪个更方便,因人而异吧。

可能之后还会写一个Docker版本的,Docker确实太好用了,不过确实是配置麻烦了一点,不过相对于这令人不爽的环境,这也不是问题了。

如今比较常用的版本

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
#!/bin/bash

# 自动获取目录
JAR_PATH=$(pwd)
# jar包名称
JAR_NAME=server-1.0.0.jar
# 端口
PORT=8800
# 环境配置
ACTIVE=dev
# 获取JAR_PATH最后一个/后面的内容
PROJECT_NAME=${JAR_PATH##*/}
# 日志路径
LOG_PATH=/data/logs/${PROJECT_NAME}
# 日志名称
LOG_NAME=service.log
# jvm参数
JVM="-Xms512m -Xmx4096m -Xmn1024m -Xss256k -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=1024m -XX:+DisableExplicitGC -XX:NewRatio=8 -XX:SurvivorRatio=6 -XX:+UseG1GC -XX:ParallelGCThreads=8 -XX:ConcGCThreads=8 -XX:+UseBiasedLocking -XX:G1HeapRegionSize=8m -XX:InitiatingHeapOccupancyPercent=70 -Xloggc:/opt/interface/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/service/dumpLogs"

#使用说明,用来提示输入参数
usage() {
echo "Usage: sh boot.sh [start|stop|restart|status|log [name]]"
exit 1
}

#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回0,存在返回1
if [ -z "${pid}" ]; then
return 0
else
return 1
fi
}

#启动方法
start(){
is_exist
if [ $? -eq 1 ]; then
echo "${JAR_NAME} is already running. pid = ${pid}"
else
nohup java -jar ${JVM} ${JAR_PATH}/${JAR_NAME} --spring.profiles.active=${ACTIVE} --server.port=${PORT} > ${JAR_PATH}/${PROJECT_NAME}.log 2>&1 &
sleep 0.5s
is_exist
if [ $? -eq 1 ]; then
echo "${JAR_NAME} is running success. pid = ${pid}"
log
else
echo "${JAR_NAME} startup failed."
cat ${JAR_PATH}/${PROJECT_NAME}.log
fi
fi
}

#停止方法
stop(){
is_exist
if [ $? -eq 1 ]; then
kill -9 $pid
is_exist
if [ $? -eq 1 ]; then
echo "${JAR_NAME} still in the running. pid = ${pid}"
else
echo "${JAR_NAME} has stopped running."
fi
else
echo "${JAR_NAME} is not running"
fi
}

#输出运行状态
status(){
is_exist
if [ $? -eq 1 ]; then
echo "${JAR_NAME} is running. pid is ${pid}"
else
echo "${JAR_NAME} is not running."
fi
}

#重启
restart(){
is_exist
if [ $? -eq 1 ]; then
kill -15 $pid
is_exist
isExist=$?
while [ $isExist -eq 1 ]
do
sleep 1s
is_exist
isExist=$?
echo "$JAR_NAME pid=$pid 正在停止中,长时间停不掉使用stop方法."
done
echo "${JAR_NAME} has stopped running."
else
echo "${JAR_NAME} is not running"
fi

if [ -f "${JAR_PATH}/${JAR_NAME}.u" ];then
echo "备份当前文件为${JAR_NAME}.`date +%Y%m%d%H%M%S`"
mv ${JAR_PATH}/${JAR_NAME} ${JAR_PATH}/${JAR_NAME}.`date +%Y%m%d%H%M%S`
echo "重命名更新文件${JAR_NAME}.u为$JAR_NAME"
mv ${JAR_PATH}/${JAR_NAME}.u ${JAR_PATH}/${JAR_NAME}
fi

start
}

#输出动态日志
log(){
if [ -n "$LOG_NAME" ]; then
tail -f -n 200 ${LOG_PATH}/${LOG_NAME}.log
else
#默认输出总日志
tail -f -n 200 ${JAR_PATH}/${PROJECT_NAME}.log
fi
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
"log")
LOG_NAME=$2
log
;;
"help")
usage
;;
*)
if [ -n "$1" ]; then
usage
else
start
fi
;;
esac