• centos环境启动/重启java服务脚本优化


    在离线环境部署的多个java应用组成的系统,测试阶段需要较为频繁的发布,因资源限制,没有弄devops或CICD那套,就简单的打包成jar进行发布。之前弄了脚本进行启动,启动前需要根据端口收到的杀掉进程再启动,否则会出现端口冲突导致启动失败,优化点之一就是要支持脚本自动重启,自动找到对应的进程再杀死重启。另外一点就是日志文件,重启后会根据服务名和当前时间生成新的日志文件,查询日志的时候如果有多个前缀的文件时,需要手动选择,比较麻烦,就想着将历史日志文件归档到当前路径下的backup文件夹中。

    部分命令说明

    首先声明本人shell菜鸟,对这块儿使用很少。

    根据端口查询服务进程

    这个我比较喜欢使用lsof命令,比如查询8080端口占用的进程可以使用一下命令

    lsof -i:8080
    

    杀死进程

    这个应该都懂,kill -9,不要简单使用kill,比如杀死进程PID为12345的进程

    kill -9 12345
    

    函数脚本接收参数

    这个比较简单命令,函数的参数依此使用$1,$2,$3…进行接收

    脚本

    因为是多个java服务,同时也秉承复用的思想,想着写个通用的方法进行服务的重启,再写多个服务对应的脚本记录好各自的服务名和端口等信息,在服务各自的脚本中传参调用通用的服务启动或重启方法。

    通用服务启动或重启脚本 run.sh

    #!/bin/bash
    
    start_app(){
      # 接收参数
      APP_NAME=$1;
      APP_PORT=$2;
      MEM=$3
      ACTION=$4;
      CURRENT_TIME=`date +"%Y%m%d%H%M%S"`
      
      #检查程序是否在运行
      APP_STATUS=`netstat -nlt|grep ${APP_PORT} |wc -l`;
      RUNNING_PID=$(netstat -nlp | grep :$APP_PORT | awk '{print $7}' | awk -F"/" '{ print $1 }');
      LOG_FILE=./logs/${APP_NAME}_${CURRENT_TIME}.log;
      cd ..;
      if [ "${APP_STATUS}" -eq 1 ]; then
        if [ "${ACTION}"x == "restart"x ]; then
          ## 重启前先kill原进程
          echo "kill the running app whose PID is ${RUNNING_PID} of ${APP_NAME}";
          kill -9 "${RUNNING_PID}";
          # 日志归档
          cd logs;
          for file in `ls ${APP_NAME}* -a`;
            do
              mv "${file}" backup/;
            done
          cd ..;
        else
          echo "exist running ${APP_NAME} and the PID is ${RUNNING_PID}";
          exit 0;
        fi
      fi
      echo "start ${APP_NAME} at $CURRENT_TIME";
      ## 启动程序
      nohup java -Xms${MEM}m -Xmx${MEM}m -XX:PermSize=256m -XX:MaxPermSize=512m -jar -Dfile.encoding=utf-8 -Dserver.port=${APP_PORT}  -Dspring.profiles.active=prod ${APP_NAME}  > ${LOG_FILE} 2>&1 &
      pid=`ps -ef|grep java|grep ${APP_NAME}`
      echo "${APP_NAME} has started successfully at ${CURRENT_TIME},and the pid is ${pid}"
    }
    

    单个的服务启动脚本

    #!/bin/bash
    action=$1
    ## 引入通用服务启动脚本
    source ./run.sh
    #启动方法
    start(){
    	# 执行通用服务脚本中的启动方法
      start_app xxx.jar 8080 4096 ${action}
    }
     
    #程序主入口
    start
    
    

    注意

    重启

    直接执行服务启动脚本不传参数的情况,会判断服务端口是否占用,占用则直接退出,传restart则会在服务启动的情况下先杀死原服务进程再重新启动。

    文档位置

    jar包位于/opt/app目录下,脚本位于/opt/app/run目录下,日志放在了/opt/app/logs目录下,目前这个版本只能支持在脚本当前目录执行,如果使用绝对路径的方式会报错,应该是脚本中的一些写法没有使用绝对路径所致,各有利弊,暂时保留此方案。

    异常

    测试过程中遇到了run.sh: xxx行 $'\r' 附近有语法错误的错误,使用sed -i ‘s/\r$//’ run.sh命令转换就行了。

  • 相关阅读:
    javac 和 java 命令
    286_C++_定时器的其中一个操作,定时重载接口—startTimer循环执行回调(未完全)
    (附源码)springboot基于微信小程序的超市收银系统 毕业设计 271611
    keepalived+nginx高可用 脑裂监控
    使用VMware搭建OceanStor_eStor存储超详细教程
    ORB-SLAM3在windows11下的编译使用
    HTML网上书店静态HTML网页作业作品 大学生三联书店网页设计制作成品 简单DIV CSS布局网站
    浅析分布式数据库
    Git--原理与使用
    项目在linux上的简单部署
  • 原文地址:https://blog.csdn.net/qq_41885819/article/details/140360530