0
点赞
收藏
分享

微信扫一扫

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

爱动漫建模 2024-07-24 阅读 41
centos

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命令转换就行了。

举报

相关推荐

0 条评论