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

news/2024/8/27 13:43:10/ 标签: 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/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命令转换就行了。


http://www.ppmy.cn/news/1475608.html

相关文章

【QT】Qt事件

目录 前置知识 事件概念 常见的事件描述 进入和离开事件 代码示例: 鼠标事件 鼠标点击事件 鼠标释放事件 鼠标双击事件 鼠标滚轮动作 键盘事件 定时器事件 开启定时器事件 窗口相关事件 窗口移动触发事件 窗口大小改变时触发的事件 扩展 前置知识…

Vue3响应系统的作用与实现

副作用函数的执行会直接或间接影响其他函数的执行。一个副作用函数中读取了某个对象的属性,当该属性的值发生改变后,副作用函数自动重新执行,这个对象就是响应式数据。 1 响应式系统的实现 拦截对象的读取和设置操作。当读取某个属性值时&a…

澳门建筑插画:成都亚恒丰创教育科技有限公司

澳门建筑插画:绘就东方之珠的斑斓画卷 在浩瀚的中华大地上,澳门以其独特的地理位置和丰富的历史文化,如同一颗璀璨的明珠镶嵌在南国海疆。这座城市,不仅是东西方文化交融的典范,更是建筑艺术的宝库。当画笔轻触纸面&a…

STM32MP135裸机编程:唯一ID(UID)、设备标识号、设备版本

0 资料准备 1.STM32MP13xx参考手册1 唯一ID(UID)、设备标识号、设备版本 1.1 寄存器说明 (1)唯一ID 唯一ID可以用于生成USB序列号或者为其它应用所使用(例如程序加密)。 (2)设备…

conda install问题记录

最近想用代码处理sar数据,解放双手。 看重了isce这个处理平台,在安装包的时候遇到了一些问题。 这一步持续了非常久,然后我就果断ctrlc了 后面再次进行尝试,出现一大串报错,不知道是不是依赖项的问题 后面看到说mam…

前端预览图片的两种方式:转Base64预览或转本地blob的URL预览,并再重新转回去

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 预览图片 一般情况下,预览图片功能,是后端返回一个图片地址资源(字符串)给前端,如:ashuai.work/static…

搜维尔科技:scalefit人体工程学分析表明站立式工作站的高度很重要

搜维尔科技:scalefit人体工程学分析表明站立式工作站的高度很重要 搜维尔科技:scalefit人体工程学分析表明站立式工作站的高度很重要

红酒与未来科技:传统与创新的碰撞

在岁月的长河中,红酒以其深邃的色泽、丰富的口感和不同的文化魅力,成为人类文明中的一颗璀璨明珠。而未来科技,则以其迅猛的发展速度和无限的可能性,领着人类走向一个崭新的时代。当红酒与未来科技相遇,一场传统与创新…

【2024最新】C++扫描线算法介绍+实战例题

扫描线介绍:OI-Wiki 【简单】一维扫描线(差分优化) 网上一维扫描线很少有人讲,可能认为它太简单了吧,也可能认为这应该算在差分里(事实上讲差分的文章里也几乎没有扫描线的影子)。但我认为&am…

1.26、基于概率神经网络(PNN)的分类(matlab)

1、基于概率神经网络(PNN)的分类简介 PNN(Probabilistic Neural Network,概率神经网络)是一种基于概率论的神经网络模型,主要用于解决分类问题。PNN最早由马科夫斯基和马西金在1993年提出,是一种非常有效的分类算法。 PNN的原理可以简单概括为以下几个步骤: 数据输入层…

Tomcat的服务部署于优化

一、tomcat是一个开源的web应用服务器,nginx主要处理静态页面,那么静态请求(连接数据库,动态页面)并不是nginx的强项,动态的请求会交给Tomcat进行处理,tomcat是用java代码写的程序,运…

[leetcode]partition-list 分隔链表

. - 力扣(LeetCode) class Solution { public:ListNode* partition(ListNode* head, int x) {ListNode *smlDummy new ListNode(0), *bigDummy new ListNode(0);ListNode *sml smlDummy, *big bigDummy;while (head ! nullptr) {if (head->val &l…

【数学建模】——【线性规划】及其在资源优化中的应用

目录 线性规划问题的两类主要应用: 线性规划的数学模型的三要素: 线性规划的一般步骤: 例1: 人数选择 例2 :任务分配问题 例3: 饮食问题 线性规划模型 线性规划的模型一般可表示为 线性规划的模型标准型&…

Oracle各种连接写法介绍

1、左连接 左连接(左外连接): 基表全部查出来,外连接表有的匹配,没有则为null; 记录数与基表的记录数相同,前提是where后未加条件过滤; 两种写法(left join&#xff09…

DP讨论——建造者模式

学而时习之,温故而知新。 敌人出招(使用场景) 组合关系中,如果要A对象创建B对象,或者要A对象创建一堆对象,这种是普遍的需求。 你出招 这种适合创建者模式,我感觉也是比较常见的。 构造函数…

《从零开始学习Linux》——开篇

前言 近日笔者新开专栏,《从零开始学习Linux》,Linux水深而且大,学了一圈之后,有懂得有不懂的,一直没有机会整体的全部重新捋一遍,本专栏的目的是,带着大家包括我自己重新学习Linux一遍这些知识…

Taro自定义FromData实现本地路径转换为文件

在用Taro写头像上传功能时,因为需要对获得的图片进行剪切成圆形或方形。使用组件剪切完之后返回的是一个本地图片的相对路径。这个时候我们就需要自己实现将本地路径重新转换为二进制文件。 引入两个js文件 mimeMap.js module.exports {"0.001": &quo…

Java集合类常见面试题

一些常见的Java集合类高频面试题包括: ArrayList和LinkedList的区别是什么?HashMap和HashTable的区别是什么?HashSet和TreeSet的区别是什么?ConcurrentHashMap的实现原理是什么?如何遍历HashMap和HashTable&#xff1…

UDP通讯实现

服务器端&#xff1a; 1.获取套接字 int fd;fdsocket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);} #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&…

Spring 事务管理配置方法

Spring中声明式的事务配置方法有两种&#xff0c;一种是注解方式&#xff0c;另一种可能用AOP切片方式来实现。 一、注解方式 在Spring配置文件中加入配置 <!-- DataSource配置 --><bean id"dataSource"class"com.mchange.v2.c3p0.ComboPooledDataSo…