当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 神经网络以及简单的神经网络模型实现
  • Matplotlib库学习之mpl_toolkits.mplot3d.Axes3D函数
  • javafx场景切换,网络编程踩坑
  • 力扣题解( 让字符串成为回文串的最少插入次数)
  • C++知识要点总结笔记
  • 关于Qt Creator 使用Qt Quick的Design模式设置
  • 【运维】docker批量删除临时镜像(两种方式)
  • Postman下载及使用说明
  • 人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解
  • 网络安全设备——EDR
  • 【Linux】Ubuntu配置JDK环境、MySQL环境
  • 无障碍全免费上手智能体:Autogen Studio结合Deepseek Coder打造一款AI旅游规划师
  • Vuforia AR篇(八)— AR塔防上篇
  • Wireshark 对 https 请求抓包并展示为明文
  • matlab R2016b安装cplex12.6,测试时cplex出现出现内部错误的解决方法
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • AWS实战 - 利用IAM对S3做访问控制
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CODING 缺陷管理功能正式开始公测
  • CSS3 变换
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Java新版本的开发已正式进入轨道,版本号18.3
  • python大佬养成计划----difflib模块
  • Python十分钟制作属于你自己的个性logo
  • React+TypeScript入门
  • SQLServer之创建数据库快照
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Sublime text 3 3103 注册码
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 包装类对象
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 微服务框架lagom
  • 走向全栈之MongoDB的使用
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #100天计划# 2013年9月29日
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ( 10 )MySQL中的外键
  • (1) caustics\
  • (C#)一个最简单的链表类
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二)原生js案例之数码时钟计时
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (三)模仿学习-Action数据的模仿
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)ABI是什么
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net Remoting常用部署结构