验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

springboot项目怎么在linux服务器上启动、停止脚本

阅读:1033 来源:乙速云 作者:代码code

springboot项目怎么在linux服务器上启动、停止脚本

本文小编为大家详细介绍“springboot项目怎么在linux服务器上启动、停止脚本”,内容详细,步骤清晰,细节处理妥当,希望这篇“springboot项目怎么在linux服务器上启动、停止脚本”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

      springboot在linux服务器上启动、停止脚本

      xxxx.sh

      #!/bin/bash
      cd `dirname $0`
      CUR_SHELL_DIR=`pwd`
      CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
      #修改这里jar包名即可
      JAR_NAME="xxxxxxxxxxxx.jar" 
      JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME
      #JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"
      JAVA_MEM_OPTS=""
      #SPRING_PROFILES_ACTIV="-Dspring.profiles.active=eureka2"
      SPRING_PROFILES_ACTIV=""
      LOG_DIR=$CUR_SHELL_DIR/logs
      LOG_PATH=$LOG_DIR/${JAR_NAME}.log
      echo_help()
      {
          echo -e "syntax: sh $CUR_SHELL_NAME start|stop"
      }
      if [ -z $1 ];then
          echo_help
          exit 1
      fi
      if [ ! -d "$LOG_DIR" ];then
          mkdir "$LOG_DIR"
      fi
      if [ ! -f "$LOG_PATH" ];then
          touch "$LOG_DIR"
      fi
      if [ "$1" == "start" ];then
      # check server
          PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
          if [ -n "$PIDS" ]; then
              echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."
              exit 1
          fi
      echo "Starting the $JAR_NAME..."
          # start
          nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &
          COUNT=0
          while [ $COUNT -lt 1 ]; do
              sleep 1
              COUNT=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`
              if [ $COUNT -gt 0 ]; then
                  break
              fi
          done
          PIDS=`ps  --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`
          echo "${JAR_NAME} Started and the PID is ${PIDS}."
          echo "You can check the log file in ${LOG_PATH} for details."
      elif [ "$1" == "stop" ];then
          PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
          if [ -z "$PIDS" ]; then
              echo "ERROR:The $JAR_NAME does not started!"
              exit 1
          fi
      echo -e "Stopping the $JAR_NAME..."
          for PID in $PIDS; do
              kill $PID > /dev/null 2>&1
          done
          COUNT=0
          while [ $COUNT -lt 1 ]; do
              sleep 1
              COUNT=1
              for PID in $PIDS ; do
                  PID_EXIST=`ps --no-heading -p $PID`
                  if [ -n "$PID_EXIST" ]; then
                      COUNT=0
                      break
                  fi
              done
          done
          echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."
      else
          echo_help
          exit 1
      fi

      以上代码只需修改jar包名即可使用

      启动jar包:

       ./xxxx.sh start

      停止 jar包

      ./xxxx.sh  stop

      授权

      chmod +x xxx.sh

      自动化部署之springboot项目快速启动停止脚本

      由于项目需要编写了Spring boot启动停止脚本

      1.脚本需要于jar包放到同一个目录下面

      脚本内容如下:

      #!/bin/bash
      appName=`ls|grep .jar$`
      if [ -z $appName ]
      then
          echo "Please check that this script and your jar-package is in the same directory!"
          exit 1
      fi
      killForceFlag=$2
      function start()
      {
          count=`ps -ef |grep java|grep $appName|wc -l`
          if [ $count != 0 ];then
              echo "Maybe $appName is running, please check it..."
          else
              echo "The $appName is starting..."
              nohup java -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G -jar $appName > /dev/null 2>&1 &
          fi
      }
      function stop()
      {
          appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
          if [ -z $appId ]
          then
              echo "Maybe $appName not running, please check it..."
          else
              echo -n "The $appName is stopping..."
              if [ "$killForceFlag" == "-f" ]
              then 
                  echo "by force"
                  kill -9 $appId
              else
                  echo
                  kill $appId
              fi
          fi
      }
      function status()
      {
          appId=`ps -ef |grep java|grep $appName|awk '{print $2}'`
          if [ -z $appId ] 
          then
              echo -e "33[31m Not running 33[0m" 
          else
              echo -e "33[32m Running [$appId] 33[0m" 
          fi
      }
      function restart()
      {
          stop
          for i in {3..1}
          do
              echo -n "$i "
              sleep 1
          done
          echo 0
          start
      }
      function usage()
      {
          echo "Usage: $0 {start|stop|restart|status|stop -f}"
          echo "Example: $0 start"
          exit 1
      }
      case $1 in
          start)
          start;;
          stop)
          stop;;
          restart)
          restart;;
          status)
          status;;
          *)
          usage;;
      esac

      2.使用说明

      app.sh脚本为快速启动应用和关闭应用的脚本,使用方法如下:

      首先,将你需要发布的jar包,和含有上述内容的脚本app.sh,上传至linux服务器,注意两者必须处于同一目录,并且该目录下只有一个jar包,并给与app.sh相应执行权限,chmod 777 app.sh

      然后就可以执行脚本,命令如下:

      命令作用
      ./app.sh start启动应用
      ./app.sh stop关闭应用
      ./app.sh restart重启应用
      ./app.sh status查看应用状态
      ./app.sh stop -f强制kill应用进程

      注意,重新发布应用时,先stop再上传替换jar包哦。

      JVM GC垃圾回收器参数设置

      JVM给出了3种选择:串行收集器、并行收集器、并发收集器。串行收集器只适用于小数据量的情况,所以生产环境的选择主要是并行收集器和并发收集器。

      默认情况下JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行智能判断。

      串行收集器

      • -XX:+UseSerialGC:设置串行收集器。并行收集器(吞吐量优先)

      • -XX:+UseParallelGC:设置为并行收集器。此配置仅对年轻代有效。即年轻代使用并行收集,而年老代仍使用串行收集。

      • -XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时有多少个线程一起进行垃圾回收。此值建议配置与CPU数目相等。

      • -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0开始支持对年老代并行收集。

      • -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间(单位毫秒)。如果无法满足此时间,JVM会自动调整年轻代大小,以满足此时间。

      • -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动调整年轻代Eden区大小和Survivor区大小的比例,以达成目标系统规定的最低响应时间或者收集频率等指标。此参数建议在使用并行收集器时,一直打开。

      并发收集器(响应时间优先)

      • -XX:+UseConcMarkSweepGC:即CMS收集,设置年老代为并发收集。CMS收集是JDK1.4后期版本开始引入的新GC算法。它的主要适合场景是对响应时间的重要性需求大于对吞吐量的需求,能够承受垃圾回收线程和应用线程共享CPU资源,并且应用中存在比较多的长生命周期对象。CMS收集的目标是尽量减少应用的暂停时间,减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代内存。

      • -XX:+UseParNewGC:设置年轻代为并发收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此参数。

      • -XX:CMSFullGCsBeforeCompaction=0:由于并发收集器不对内存空间进行压缩和整理,所以运行一段时间并行收集以后会产生内存碎片,内存使用效率降低。此参数设置运行0次Full GC后对内存空间进行压缩和整理,即每次Full GC后立刻开始压缩和整理内存。

      • -XX:+UseCMSCompactAtFullCollection:打开内存空间的压缩和整理,在Full GC后执行。可能会影响性能,但可以消除内存碎片。

      • -XX:+CMSIncrementalMode:设置为增量收集模式。一般适用于单CPU情况。

      • -XX:CMSInitiatingOccupancyFraction=70:表示年老代内存空间使用到70%时就开始执行CMS收集,以确保年老代有足够的空间接纳来自年轻代的对象,避免Full GC的发生。

      其它垃圾回收参数

      • -XX:+ScavengeBeforeFullGC:年轻代GC优于Full GC执行。

      • -XX:-DisableExplicitGC:不响应 System.gc() 代码。

      • -XX:+UseThreadPriorities:启用本地线程优先级API。即使 java.lang.Thread.setPriority() 生效,不启用则无效。

      • -XX:SoftRefLRUPolicyMSPerMB=0:软引用对象在最后一次被访问后能存活0毫秒(JVM默认为1000毫秒)。

      • -XX:TargetSurvivorRatio=90:允许90%的Survivor区被占用(JVM默认为50%)。提高对于Survivor区的使用率。

      JVM参数疑问解答

      -Xmn,-XX:NewSize/-XX:MaxNewSize,-XX:NewRatio 3组参数都可以影响年轻代的大小,混合使用的情况下,优先级是什么?

      如下:

      • 高优先级:-XX:NewSize/-XX:MaxNewSize

      • 中优先级:-Xmn(默认等效 -Xmn=-XX:NewSize=-XX:MaxNewSize=?)

      • 低优先级:-XX:NewRatio

      推荐使用-Xmn参数,原因是这个参数简洁,相当于一次设定 NewSize/MaxNewSIze,而且两者相等,适用于生产环境。-Xmn 配合 -Xms/-Xmx,即可将堆内存布局完成。

      -Xmn参数是在JDK 1.4 开始支持。

      JVM参数设置优化例子

      1. 承受海量访问的动态Web应用

      服务器配置:8 CPU, 8G MEM, JDK 1.6.X

      参数方案:

      -server -Xmx3550m -Xms3550m -Xmn1256m -Xss128k -XX:SurvivorRatio=6 -XX:MaxPermSize=256m -XX:ParallelGCThreads=8 -XX:MaxTenuringThreshold=0 -XX:+UseConcMarkSweepGC

      调优说明:

      • -Xmx-Xms 相同以避免JVM反复重新申请内存。-Xmx 的大小约等于系统内存大小的一半,即充分利用系统资源,又给予系统安全运行的空间。

      • -Xmn1256m 设置年轻代大小为1256MB。此值对系统性能影响较大,Sun官方推荐配置年轻代大小为整个堆的3/8。

      • -Xss128k 设置较小的线程栈以支持创建更多的线程,支持海量访问,并提升系统性能。

      • -XX:SurvivorRatio=6 设置年轻代中Eden区与Survivor区的比值。系统默认是8,根据经验设置为6,则2个Survivor区与1个Eden区的比值为2:6,一个Survivor区占整个年轻代的1/8。

      • -XX:ParallelGCThreads=8 配置并行收集器的线程数,即同时8个线程一起进行垃圾回收。此值一般配置为与CPU数目相等。

      • -XX:MaxTenuringThreshold=0 设置垃圾最大年龄(在年轻代的存活次数)。如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率;如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。根据被海量访问的动态Web应用之特点,其内存要么被缓存起来以减少直接访问DB,要么被快速回收以支持高并发海量请求,因此其内存对象在年轻代存活多次意义不大,可以直接进入年老代,根据实际应用效果,在这里设置此值为0。

      • -XX:+UseConcMarkSweepGC 设置年老代为并发收集。CMS(ConcMarkSweepGC)收集的目标是尽量减少应用的暂停时间,减少Full GC发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代内存,适用于应用中存在比较多的长生命周期对象的情况。

      2. 内部集成构建服务器案例

      高性能数据处理的工具应用

      服务器配置:1 CPU, 4G MEM, JDK 1.6.X

      参数方案:

      -server -XX:PermSize=196m -XX:MaxPermSize=196m -Xmn320m -Xms768m -Xmx1024m

      调优说明:

      • -XX:PermSize=196m -XX:MaxPermSize=196m 根据集成构建的特点,大规模的系统编译可能需要加载大量的Java类到内存中,所以预先分配好大量的持久代内存是高效和必要的。

      • -Xmn320m 遵循年轻代大小为整个堆的3/8原则。

      • -Xms768m -Xmx1024m 根据系统大致能够承受的堆内存大小设置即可。

      脚本中可以修改的地方:

      19行: nohup java -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -Xms512M -Xmx4G -jar $appName > /dev/null 2>&1 &

      这是最终jar的启动命令,在这里你需要对gc、Xms、Xmx等针对你机器的实际情况修改,还可以添加你所需要的启动参数等。

      56行: for i in {3..1}

      这里是设置restart的时候等待的时间,因为有的项目在3秒之内可能没有办法正常停止,所以可以调整为5秒,保证应用确实正常停止后再启动

    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>