一、前言 部署Spring Boot项目可以使用Maven命令mvn:clean package将项目打包成只执行的jar文件,然后使用命令java -jar XX.jar来执行。但这样做无法将shell命令行释放,关闭terminal后项目也随之关闭了。这里介绍在Linux系统中后台运行Spring Boot jar文件的方法。
实现这个功能主要依赖于Linux的nohup命令。nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。
二、nohup语法 nohup 命令 用途:不挂断地运行命令。 语法:nohup Command [ Arg … ][ & ]
所以只需要在启动命令前加上nohup命令,末尾加上&即可:nohup java -jar XX.jar &。
为了方便,我们可以编写启动脚本start.sh:
nohup java -jar XX.jar &
三、关停脚本stop.sh 1 2 3 4 5 6 7 8 PID=`ps -ef | grep xx.jar | grep -v grep | awk '{print $2}'` if [ -z "$PID" ] then echo Application is already stopped else echo kill $PID kill -9 $PID fi
四、重启脚本run.sh 1 2 3 4 echo stop application source stop.sh echo start application source start.sh
五、在编写shell脚本的过程中遇到了两个问题 5.1.执行.sh文件提示权限不足 解决办法:执行命令chmod u+x XX.sh赋予当前用于可执行的权限即可。
5.2.提示/bin/bash^M: bad interpreter: 没有那个文件或目录 问题出现的原因是shell脚本是在windows中编写的然后上传到Linux中的,出现了兼容性问题。解决办法:执行vim XX.sh打开shell文件,然后切换到命令模式,执行:set fileformat=unix后保存退出即可。
使用了nohup命令后,会在jar文件目录下生成一个nohup.out文件,可通过其观察当前项目的运行情况.
六、改良后的维护脚本wh.sh 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 #!/bin/bash #jar包名称 AppName=xx.jar #JVM参数 JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" APP_HOME=`pwd` LOG_PATH=$APP_HOME/logs/$AppName.log if [ "$1" = "" ]; then echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m" exit 1 fi if [ "$AppName" = "" ]; then echo -e "\033[0;31m 未输入应用名 \033[0m" exit 1 fi function start() { PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` if [ x"$PID" != x"" ]; then echo "$AppName is running..." else nohup java -jar $JVM_OPTS $AppName & #nohup java -jar $JVM_OPTS $AppName > /dev/null 2>&1 & echo "Start $AppName success..." fi } function stop() { echo "Stop $AppName" PID="" query(){ PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` } query if [ x"$PID" != x"" ]; then kill -TERM $PID echo "$AppName (pid:$PID) exiting..." while [ x"$PID" != x"" ] do sleep 1 query done echo "$AppName exited." else echo "$AppName already stopped." fi } function restart() { stop sleep 2 start } function status() { PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l` if [ $PID != 0 ];then echo "$AppName is running..." else echo "$AppName is not running..." fi } case $1 in start) start;; stop) stop;; restart) restart;; status) status;; *) esac