shell脚本自动化执行jar包

news2024/10/7 1:28:28

需要用shell脚本来自动化执行jar包,以后可以用jenkins来CI/CD,记录一下对应实现。

实现需求

  1. 以命令行执行shell传入的第一个参数为jar名进行执行。
  2. 对应jar已存在执行进程,关闭对应进程后再执行。
  3. 以后台方式执行对应的jar包,输出log文件并判断是否成功执行。

测试用jar包和功能

为了保持进程执行不退出,主程序写死循环输出时间。
jar名为shellTestDemo.jar

public class MainApplication {
    public static void main(String[] args){
        while(true){
            try {
                System.out.println(new Date());
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

shell实现

名称读取并判断是否存在

#!/bin/bash

# 传参作为jar名称
application_name=${1}
application_place="/home/huiluczp/huiluczp/${application_name}"

# 判断文件名以及是否存在
if [ -z $( echo ${application_name} | grep '.*.jar$' ) ];
    then
        echo "jar名称不规范,退出"
        exit 1
    else
        echo "jar名称为${application_name}"
fi

if [ -e ${application_place} -a -f ${application_place} ]
    then
        echo "jar存在,开始build工作"
    else
        echo "jar不存在,退出"
        exit 1
fi

${1}获取第一个传入参数,利用正则进行名称格式的判断,判断式来判断对应路径下是否存在对应jar,确定存在后进行后续处理。

判断对应进程是否存在

# 先判断是否有对应的进程存在
echo "开始进程清理工作"
pid=$(ps -ef | grep "${application_name}" | grep 'java -jar' | grep -v 'grep' | awk '{print $2}')

命令首先用ps来找到所有进程信息,并使用grep匹配对应jar名称和java进程。为了防止把grep命令执行进程也算进去,使用-v参数来剔除对应进程信息。最后使用awk来获取对应的pid。

停止现有进程

包括两部分,停止现有进程和判断是否成功。

# 存在则杀死已存在进程

if [ -z ${pid} ];
    then
        echo "进程${pid}不存在"
    else
        # 可能会有多个进程,分别处理
        for p in ${pid}
        do
            echo "进程${p} killing"
            kill -15 ${p}
            sleep 1
        done
fi

考虑可能会有数个进程同时存在,循环进行kill。

# 循环判断是否成功杀死进程
final=''
while [ -z ${final} -a ![ -z ${pid} ] ];
    do  
        for p in ${pid}
        do
            result=$(ps -ef | grep -w ${p} | grep 'java')
            if [ -z ${result} ];
                then
                    echo "进程${p}已被杀死, 开始build ${application_name}"
                    final='true'
                else
                    echo "进程${p}未被杀死, 继续尝试"
                    final=''
                    kill -9 ${p}
                    sleep 1
            fi
        done
    done

while循环,final作为flag,每一次碰上未被停止的进程就将其置空,保证将所有的进程都kill之后再进行下一步。

启动jar并判断是否成功

# jar启动
echo "进程check完成, 启动${application_name}, 位置为${application_place}"
sleep 1
`nohup java -jar ${application_place} > ./log.txt 2>&1 &`

使用nohup将java程序在后台执行,将输出结果存到log.txt中,并将错误信息也写入。

# 判断启动是否成功(5次最高)
for (( i=1; i<6; i=i+1))
    do
        pid=$(ps -ef | grep ${application_name} | grep 'java -jar' | grep -v 'grep' | awk '{printf $2}')
        if [ -z ${pid} ];
            then
                echo "进程不存在, 正在重试"
                sleep 1
            else
                echo "进程${pid}启动成功"
                exit 0
        fi
done
exit 1

循环判断进程是否成功启动,不成功就算了,成功立刻exit

效果展示

在这里插入图片描述
手动启动jar程序,pid17193。
在这里插入图片描述
执行脚本,停止现有进程,并执行新进程17225。中间有个错误提示,因为grep pid的时候拿到的是一个类似数组的东西,直接-z的时候会报错,不过不影响判断以及后续的脚本执行,觉得碍眼的话2>/dev/null把报错扔了就好。
在这里插入图片描述
在这里插入图片描述
成功执行并写入log信息。

总结

记录了自动执行jar的脚本,主要包含前置的判断和现有进程关闭,以及自动执行后台java命令两部分。整体的思路还是比较明确的,不过真写的时候要注意的还挺多,比如pid拿来的时候可能有多个等。自动化脚本还是比较方便,以后可以用来持续部署,挺好的。

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

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

相关文章

pymysql执行非查询语句会自动提交事务,关闭事务自动提交

一、前置条件 在mysql数据库生成数据&#xff1a; CREATE DATABASE mydatabase;CREATE TABLE Course (CourseID INT PRIMARY KEY,CourseName VARCHAR(100),Instructor VARCHAR(100),Credits INT,StudentID INT,FOREIGN KEY (StudentID) REFERENCES StudentInformation(Studen…

基于微信小程序四六级助手系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W…

【C++prime plus中文第六版勘误记录】

P219-P220 这里对未进行初始化的指针pt进行了解引用的操作&#xff0c;这是不合理的&#xff0c;此问题在 stack overflow上也有人提出疑问&#xff0c;下面是问题与解答&#xff1a;

基于微信小程序的校园维修平台设计与实现(源码+lw+部署文档+讲解等

文章目录 前言学生微信小程序端的主要功能有&#xff1a;维修员微信小程序的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取…

Android 实现椭圆形中心发散渐变绘制

1. 前言 工作中有一个需求,需要实现一个椭圆形的中心发散渐变效果,并且可以自由指定椭圆比例,旋转角度等。 Android中实现椭圆形的绘制很简单,只需要调用canvas.drawOval()就可以了,圆形的中心发散渐变可以使用RadialGradient,但是椭圆形的中心发散渐变效果Android自带的…

Leetcode算法入门与数组丨6. 数组双指针、滑动窗口

文章目录 1 双指针基础知识1.1 双指针简介1.2 左右指针&#xff08;对撞指针&#xff09;1.3 快慢指针1.4 分离双指针 2 滑动窗口基础知识2.1 滑动窗口算法介绍2.2 滑动窗口适用范围2.3 固定长度滑动窗口2.4 不固定长度滑动窗口 1 双指针基础知识 1.1 双指针简介 双指针&…

LeetCode算法心得——美丽塔 I(HashMap)

大家好&#xff0c;我是晴天学长&#xff0c;hashmap的灵活应用&#xff0c;然后边界的细节处理&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .美丽塔 美丽塔 I 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴…

SpringBoot项目(百度AI整合)——如何在Springboot中使用文字识别OCR入门

前言 前言&#xff1a;本系列博客尝试结合官网案例&#xff0c;阐述百度 AI 开放平台里的组件使用方式&#xff0c;核心是如何在spring项目中快速上手应用。 本文介绍如何在Springboot中使用百度AI的文字识别OCR 其他相关的使用百度AI的文章列表如下&#xff1a; 如何在Spri…

【SpringBoot】-SpringBoot配置文件

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;.properties 配置文件和 .yml 配置文件中 配置信息的设置和获取。关于IDEA乱码的解决。.yml 配置文件的 方式语法分析和演示。 .yml配置文件 …

芯片验证就是一次旅行

如果你国庆希望去一个你不曾去过的城市旅行&#xff0c;比如“中国苏州”。对游客来说&#xff0c;它是个蛮大的城市&#xff0c;有许多景点可以游玩&#xff0c;还有许多事情可以做。但实际上&#xff0c;即使最豪也最清闲的游客也很难看苏州的所有方方面面。同样的道理也适用…

第 4 章 串(文本行编辑实现)

1. 背景说明 该文本编辑器利用串的堆实现&#xff0c;其中对串的原始存储方式基本不作修改&#xff08;有部分修改之处&#xff09;&#xff0c;优化之处在于在串的末尾加上了一个空字符&#xff0c;目的是区分字符串结尾&#xff0c;便于将串保存在文件中&#xff0c;且该优化…

JavaScript入门——(2)基础语法(上)

一、JavaScript介绍 1.1 JavaScript是什么 1.1.1 JavaScript是什么&#xff1f; JavaScript是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果。 注意&#xff1a;HTML和CSS是标记语言。 1.1.2 作用&#xff08;做什么&#xff1f…

8月最新修正版风车IM即时聊天通讯源码+搭建教程

8月最新修正版风车IM即时聊天通讯源码搭建教程。风车 IM没啥好说的很多人在找,IM的天花板了,知道的在找的都知道它的价值,开版好像就要29999,后端加密已解,可自己再加密,可反编译出后端项目源码,已增加启动后端需要google auth双重验证,pc端 web端 wap端 android端 ios端 都有 …

小米机型解锁bl 跳“168小时”限制 操作步骤分析

写到前面的安全提示 了解解锁bl后的风险&#xff1a; 解锁设备后将允许修改系统重要组件&#xff0c;并有可能在一定程度上导致设备受损&#xff1b;解锁后设备安全性将失去保证&#xff0c;易受恶意软件攻击&#xff0c;从而导致个人隐私数据泄露&#xff1b;解锁后部分对系…

老胡的周刊(第109期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 lobe-chat[2] LobeChat 是一个开源的、可扩展…

面试题:说说Java并发运行中的一些安全问题

文章目录 1.什么是多线程并发运行安全问题&#xff1f;2.用synchronized修饰的方法3.同步块4.使用Synchronized修饰静态方法5.互斥锁6.死锁现象7.wait()和sleep()的区别 1.什么是多线程并发运行安全问题&#xff1f; 当多个线程并发操作一个数据时&#xff0c;由于线程操作的时…

在Linux上安装Percona Toolkit工具

安装步骤 1. 下载安装包 下载地址&#xff1a;https://www.percona.com/software/database-tools/percona-toolkit 2.上传并解压 上传tar包到服务器&#xff0c;并通过tar -zxvf 文件名.tar.gz解压。工具在bin文件夹中&#xff0c;这个是免安装的。 3. 配置环境变量 配置…

安装OpenSearch

title: “安装opensearch” createTime: 2021-11-30T19:13:4508:00 updateTime: 2021-11-30T19:13:4508:00 draft: false author: “name” tags: [“es”,“安装”] categories: [“OpenSearch”] description: “测试的” 说明 基于Elasticsearch7.10.2 的 opensearch-1.1.…

gRPC之实现TLS通信加密_已设置图床

gRPC之实现TLS通信加密 "crypto/tls"包 “crypto/tls” 是 Go 编程语言中的一个包&#xff0c;用于实现 TLS&#xff08;传输层安全&#xff09;协议。TLS 协议用于加密和保护网络通信&#xff0c;通常用于保护敏感数据的传输&#xff0c;如密码、支付信息等。在 G…

详解--计算机存储相关(寄存器、CPU Cache、内存、外存)

CPU寄存器、高速缓冲存储器、主存储器、外存储器 1. 主存储器 参考链接–主存 参考链接–内存 主存储器简称 主存&#xff0c;又称 内存储器&#xff08;简称 内存&#xff09;。作用 暂时存放CPU中的运算数据。存放指令和数据&#xff0c;并能由中央处理器&#xff08;CPU&a…