欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > centos环境启动/重启java服务脚本优化

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

2024/12/4 3:12:57 来源:https://blog.csdn.net/qq_41885819/article/details/140360530  浏览:    关键词:centos环境启动/重启java服务脚本优化

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/bashstart_app(){# 接收参数APP_NAME=$1;APP_PORT=$2;MEM=$3ACTION=$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 ]; thenif [ "${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`;domv "${file}" backup/;donecd ..;elseecho "exist running ${APP_NAME} and the PID is ${RUNNING_PID}";exit 0;fifiecho "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命令转换就行了。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com