shell脚本自动化部署tomcat

news2024/9/24 9:28:26

前言

在一个月黑风高的晚上,在公司把程序打包好后,发给现场,结果又被告知不能登录命令行界面部署程序(tomcat部署),只能提供一个shell脚本实现自动化部署,于是拿出我0.5年的开发经验,10分钟写了个shell脚本给到现场
在这里插入图片描述

实战解说(拆解步骤)

我们先想想tomcat部署一个程序需要经过几个步骤:
1.中止程序

2.删除conf下的旧war

3.将新war包移动到conf目录下

4.启动程序

1.获取tomcat所在路径、获取bin所在目录、获取conf所在目录、war名称

dpTomcatPath="apache-tomcat-8.5.31-billserviceTP-8080"

binPath="$dpTomcatPath/bin"

confPath="$dpTomcatPath/conf"

warName="billserviceTP.war"

2.中止程序运行

在我们执行这一步的时候,发现一个问题,如果直接调用shutdown.sh的话,不一定能将程序完全停止,导致你在查看进程的时候,会发现程序还在,所以我们在调用shutdown.sh之后,根据是否存在pid还需要去执行“杀”进程这么一个操作。

获取pid

pid=`ps -ef | grep tomcat | grep -w $dpTomcatPath | grep -v 'grep' | awk '{print $2}'`

① ps -ef | grep tomcat

获取tomcat的进程

② grep -w $dpTomcatPath

grep -w xxx强制grep命令只匹配包含指定xxx的行,也可以说是强制筛选

我们来看看通过这两个命令筛选出来的进程

[root@centos7 ~]$ ps -ef | grep tomcat | grep -w /opt/apache-tomcat-8.5.31-billserviceTP-8080
root       19580       1  0 May10 ?        00:33:32 /usr/jre/jre1.8.0_333/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-8.5.31-billserviceTP-8080/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-8.5.31-billserviceTP-8080/bin/bootstrap.jar:/opt/apache-tomcat-8.5.31-billserviceTP-8080/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-8.5.31-billserviceTP-8080 -Dcatalina.home=/opt/apache-tomcat-8.5.31-billserviceTP-8080 -Djava.io.tmpdir=/opt/apache-tomcat-8.5.31-billserviceTP-8080/temp org.apache.catalina.startup.Bootstrap start

root  1778519 1778039  0 11:54 pts/0    00:00:00 grep --color=auto -w /opt/apache-tomcat-8.5.31-billserviceTP-8080

③ grep -v ‘grep’

==grep -v ‘grep’==这个命令的作用就是,grep命令可以输出除匹配指定字符的行以外的其他所有行

[root@centos7 ~]$ ps -ef | grep tomcat | grep -w /opt/apache-tomcat-8.5.31-billserviceTP-8080 | grep -v 'grep'
root       19580       1  0 May10 ?        00:33:32 /usr/jre/jre1.8.0_333/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-8.5.31-billserviceTP-8080/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-8.5.31-billserviceTP-8080/bin/bootstrap.jar:/opt/apache-tomcat-8.5.31-billserviceTP-8080/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-8.5.31-billserviceTP-8080 -Dcatalina.home=/opt/apache-tomcat-8.5.31-billserviceTP-8080 -Djava.io.tmpdir=/opt/apache-tomcat-8.5.31-billserviceTP-8080/temp org.apache.catalina.startup.Bootstrap start

④ awk ‘{print $2}’

当我们查询出了进程的详细信息,现在需要获取该进程信息的PID,我们就可以使用awk命令将自己需要的某一列数据单独提取出来

[root@centos7 ~]$ ps -ef | grep tomcat | grep -w /opt/apache-tomcat-8.5.31-billserviceTP-8080 | grep -v 'grep' | awk '{print $2}'
19580

$2代表提取进程信息中第二列的值,而我们使用ps命令查询出的进程信息中的第二列对应的正好就是进程的PID,如果是**$0**表示获取整个当前行)

中止程序(“杀”进程)

我们在这个步骤需要获取两次pid
第一次获取pid:判断pid是否为空,不为空我们执行执行shutdown.sh操作,等待2s

第二次获取pid:判断pid是否为空,还不为空我们执行执行kill操作,“杀”进程

if [ -n "$pid" ]; then
$binPath"/shutdown.sh"
sleep 2s
pid=`ps -ef | grep tomcat | grep -w $dpTomcatPath | grep -v 'grep' | awk '{print $2}'`
if [ -n "$pid" ]; then
kill -9 $pid
sleep 2s
else
echo "使用shutdown命令成功中止程序!"
fi
else
echo "程序未启动!"
fi

-n xxx 的意义就是判断xxx是否为空

3.删除conf下的旧war,并将新war移动到conf目录下

rm -rf $confPath"/"$warName
cp /tmp/$warName $confPath

rm -rf 为命令行删除文件,慎用,该操作无法撤回!
cp 是将源文件复制一份到目标目录中

4.启动程序

$binPath"/startup.sh"

完整命令

#!/bin/bash

dpTomcatPath="apache-tomcat-8.5.31-billserviceTP-8080"

binPath="$dpTomcatPath/bin"

confPath="$dpTomcatPath/conf"

warName="xxx.war"

pid=`ps -ef | grep tomcat | grep -w $dpTomcatPath | grep -v 'grep' | awk '{print $2}'`
if [ -n "$pid" ]; then
$binPath"/shutdown.sh"
sleep 2s
pid=`ps -ef | grep tomcat | grep -w $dpTomcatPath | grep -v 'grep' | awk '{print $2}'`
if [ -n "$pid" ]; then
kill -9 $pid
sleep 2s
else
echo "使用shutdown命令成功中止程序!"
fi
else
echo "程序未启动!"
fi

rm -rf $confPath"/"$warName
cp /tmp/$warName $confPath

$binPath"/startup.sh"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring MVC获取参数和自定义参数类型转换器及编码过滤器

目录 一、使用Servlet原生对象获取参数 1.1 控制器方法 1.2 测试结果 二、自定义参数类型转换器 2.1 编写类型转换器类 2.2 注册类型转换器对象 2.3 测试结果 三、编码过滤器 3.1 JSP表单 3.2 控制器方法 3.3 配置过滤器 3.4 测试结果 往期专栏&文章相关导读…

MySQL数据库学习笔记二

数据库存储引擎 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)通过数据引擎,对数据进行创建、查询、修改和删除的操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎…

Kubios HRV心率变异性分析软件

Kubios HRV是由东芬兰大学研究团队开发的一款心率变异性分析软件,目前在全球128个国家被1200所大学的科研人员使用。 PC端的Kubios HRV主要分免费版(Standard)和收费版(Premium)两个版本。 免费版仅支持RR间期时间序…

Git添加与提交文件与查看

目录 一、Git添加 二、Git提交文件 三、查看Git仓库的提交历史和当前状态 一、Git添加 1、在终端或命令提示符中,导航到你的Git项目所在的目录,使用 cd 命令切换目录。 2、在目标目录中,运行以下命令来初始化一个新的Git仓库,…

【跟小嘉学 Rust 编程】一、Rust 编程基础

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 文章目录 系列文章目录前言一、Rust是什么?二、Rust 开发环境搭建2.1、下载地址2.2、Windows 环境安装 可以参考2.3、Mac 环境安装2.3.1、安装步骤2.3.2、执行完上述命令之后,有如下提示 2.4、安…

深度学习----第J1周:ResNet50算法实战

深度学习----第J1周:ResNet50算法实战 🍨 本文为🔗365天深度学习训练营 中的学习记录博客** 参考文章:Pytorch实战 | 第P5周:运动鞋识别**🍖 原作者:K同学啊|接辅导、项目定制 文章目录 深度学习…

Elasticsearch 分词器

前奏 es的chinese、english、standard等分词器对中文分词十分不友好,几乎都是逐字分词,对英文分词比较友好。 在kibana的dev tools中测试分词: POST /_analyze {"analyzer": "standard","text": "你太…

chatgpt赋能python:Python文件导出方法详解

Python文件导出方法详解 Python是一种高级编程语言,广泛应用于各种数据科学、人工智能、Web开发等领域。在Python开发中,我们需要将处理好的数据与结果输出为合适的格式,文件导出是常见的输出方式之一。在本文中,我们将详细介绍P…

【C++篇】C++的输入和输出

友情链接:C/C系列系统学习目录 知识总结顺序参考C Primer Plus(第六版)和谭浩强老师的C程序设计(第五版)等,内容以书中为标准,同时参考其它各类书籍以及优质文章,以至减少知识点上的…

chatgpt赋能python:Python整人代码大全

Python整人代码大全 作为一名有10年Python编程经验的工程师,我深知Python这门编程语言广泛应用于各种领域,包括网络编程、数据分析、人工智能等等。然而,Python同样也有着一些有趣的应用,比如用来整人。 在这篇文章中&#xff0…

[设计模式] OOP六大原则

文章目录 前言1、六大原则1.1、单一职责原则1.2、开闭原则1.3、里氏替换原则1.4、依赖倒置原则1.5、接口隔离原则1.6、迪米特原则 前言 Object Oriented Programming 面向对象编程 1、六大原则 1.1、单一职责原则 就一个类而言,应该仅有一个引起它变化的原因。应…

MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 -- 下

MIT 6.S081 教材第四章内容 -- 下 引言从内核空间陷入页面错误异常Page Fault BasicsLazy page allocationZero Fill On DemandCopy On Write ForkDemand PagingMemory Mapped Files 真实世界 引言 MIT 6.S081 2020 操作系统 本文为MIT 6.S081课程第四章教材内容翻译加整理。…

机器人工程创新类课程补充说明-2023-

内容仅供参考,不严谨。 案例: 在f1tenth仿真中如何实现更快速的跑圈-曲线分析篇 所有课程其实主动权永远都掌握在学生手中,愿意学的会多花时间自主研究(主动学习),不愿意的就会用一些独特手段应付&#xf…

硬件入门之什么是电感

硬件入门之什么是电感 文章目录 硬件入门之什么是电感一、电感是什么?电感在电路中的作用:通直流隔交流,防止电流突变,储能。 二、实际应用场景常见电容:1.贴片电感(无正负极之分)2、变压器&…

第六章 MobileNetv1网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

chatgpt赋能python:Python文件怎么改名:简单易用的方法

Python文件怎么改名:简单易用的方法 在Python开发中,文件的重命名是一个经常用到的操作。无论是更改文件名还是批量重命名,在Python中都可以非常轻松地实现。本文将介绍三种不同的方法来改变Python文件的名称。 方法一:使用os模…

哔哩下载姬 - DownKyi

这款开源工具小编自己还是蛮喜欢的,有兴趣的小伙伴可以体验学习下。 一、简单介绍 Downkyi是一个极其便捷的开源工具,专为Bilibili视频下载而设计。它拥有一个简洁、直观的界面,操作逻辑流畅无比。Downkyi能够下载几乎所有B站视频&#xff0…

11.创建CentOS虚拟机

创建不同类型的实例虚拟机,我们是需要根据需求来准备镜像上传到glance,注意 ISO 镜像上传上去是没法直接使用的,需要将 ISO 镜像转变成qcow2磁盘文件,然后上传磁盘文件,就可以创建云主机。 官方镜像仓库地址&#xff1…

FBM237 RH914XS而且控制部件采用冗余容错技术,运行可靠性提高

​ FBM237 RH914XS而且控制部件采用冗余容错技术,运行可靠性提高 FBM237 RH914XS而且控制部件采用冗余容错技术,运行可靠性提高 概述 dcs系统与其他计算机设备是由电子元件和大规模集成电路构成,结构紧密,而且控制部件采用冗余容错技术,运行可靠性提高。…

人工智能气象一:深度学习预测浅水方程模式

查看原文>>>基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用能力 目录 专题一、Python软件的安装及入门 专题二、气象常用科学计算库 专题三、气象海洋常用可视化库 专题四、爬虫和气象海洋数据 专题五、气象海洋常用插值方法 专题六、机器…