学海无涯,旅“途”漫漫,“途”中小记,如有错误,敬请指出,在此拜谢!
前情提要
1.此脚本仅支持SpringBoot的java -jar的形式。
2.此脚本需要在linux上安装好java,且环境变量中已经存在java的功能命令。即在命令行中,使用java、jps命令有结果。(如果没有配置环境,请将代码行中的java、jps相关命令前加上java的存放地址即可)
3.如果运行脚本时出现换行符或者制表符的问题,请用dos2unix进行转换。
脚本
############################################
# java SpringBoot启动脚本
# 注意此脚本仅支持已经配置java的环境变量
# @author shaolin
# @since 2019年12月27日
# @param 需要编辑APP_HOME,APP_NAME,APP_OPTS,LOG_PATH
# 使用命令为 [该文件.sh] [命令] [文件名]
# 比如 operation.sh start springboot.jar
# 其中命令包含
# start 启动
# stop 停止
# status 查看状态
# restart 重启(即先stop,在start)
# info 查看脚本信息
############################################
############################################
# 判断传入第二个参数的文件是否存在
# 如果存在则输出"已查找到文件",并继续执行
# 如果不存在则输出"文件不存在!",然后停止执行
############################################
if [ -f $2 ];then
echo "已查找到文件"
else
echo "文件不存在!"
exit 1
fi
#Java程序所在的目录(如果该方法在jar的同一目录,则此处为点)
APP_HOME="."
#Java程序的名字
APP_NAME=$2
#java虚拟机启动参数
#JAVA_OPTS="-Xms128m -Xmx512m -Djava.awt.headless=true -XX:MaxPermSize=128m"
JAVA_OPTS=""
#如果要将控制台日志输出到文件中,则此处配置$APP_HOME/output.out,如果不输出,则为/dev/null
LOG_PATH="/dev/null"
#初始化psid变量(全局)
psid=0
###################################
#(函数)判断程序是否已启动
#
#说明:
#使用JDK自带的JPS命令及grep命令组合,准确查找pid
#jps 加 l 参数,表示显示java的完整包路径
#使用awk,分割出pid ($1部分),及Java程序名称($2部分)
###################################
checkpid() {
javaps=`jps -l | grep $APP_NAME`
if [ -n "$javaps" ]; then
psid=`echo $javaps | awk '{print $1}'`
else
psid=0
fi
}
###################################
#(函数)启动程序
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则提示程序已启动
#3. 如果程序没有被启动,则执行启动命令行
#4. 启动命令执行后,再次调用checkpid函数
#5. 如果步骤4的结果能够确认程序的pid,则打印[OK],否则打印[Failed]
#注意:echo -n 表示打印字符后,不换行
#注意: "nohup 某命令 >/dev/null 2>&1 &" 的用法
###################################
start() {
checkpid
if [ $psid -ne 0 ]; then
echo "================================"
echo "warn: 系统已经启动! (pid=$psid)"
echo "================================"
else
nohup java -jar $JAVA_OPTS $APP_HOME/$APP_NAME >> $LOG_PATH 2>&1 &
checkpid
if [ $psid -ne 0 ]; then
echo "(pid=$psid) 系统启动成功[OK]"
else
echo "系统启动失败[Failed]"
fi
fi
}
###################################
#(函数)停止程序
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则开始执行停止,否则,提示程序未运行
#3. 使用kill -9 pid命令进行强制杀死进程
#4. 执行kill命令行紧接其后,马上查看上一句命令的返回值: $?
#5. 如果步骤4的结果$?等于0,则打印[OK],否则打印[Failed]
#6. 为了防止java程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用stop)。
#注意:echo -n 表示打印字符后,不换行
#注意: 在shell编程中,"$?" 表示上一句命令或者一个函数的返回值
###################################
stop() {
checkpid
if [ $psid -ne 0 ]; then
echo -n "正在停止系统 ...(pid=$psid) "
su - $RUNNING_USER -c "kill -9 $psid"
if [ $? -eq 0 ]; then
echo "停止成功[OK]"
else
echo "停止失败[Failed]"
fi
checkpid
if [ $psid -ne 0 ]; then
stop
fi
else
echo "================================"
echo "warn: 系统没有运行"
echo "================================"
fi
}
###################################
#(函数)检查程序运行状态
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则提示正在运行并表示出pid
#3. 否则,提示程序未运行
###################################
status() {
checkpid
if [ $psid -ne 0 ];then
echo "系统正在运行! (pid=$psid)"
else
echo "系统没有在运行!"
fi
}
###################################
#(函数)打印系统环境参数
###################################
info() {
echo "System Information:"
echo "****************************"
echo `head -n 1 /etc/issue`
echo `uname -a`
echo
echo "JAVA_HOME=$JAVA_HOME"
echo `$JAVA_HOME/bin/java -version`
echo
echo "APP_HOME=$APP_HOME"
echo "****************************"
}
###################################
#读取脚本的第一个参数($1),进行判断
#参数取值范围:{start|stop|restart|status|info}
#如参数不在指定范围之内,则打印帮助信息
###################################
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
stop
start
;;
'status')
status
;;
'info')
info
;;
*)
echo "Usage: $0 {start|stop|restart|status|info}"
exit 1
esac
exit 0