shell脚本自动化执行jar包

2023-09-21 14:13:27

需要用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拿来的时候可能有多个等。自动化脚本还是比较方便,以后可以用来持续部署,挺好的。

更多推荐

python+vue+elementui舞蹈教学视频评分系统_o4o1y

该系统从三个对象:由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页,个人中心,裁判员管理,用户管理,视频分类管理,健美操管理,评分管理,系统管理等功能进行管理。本系统在一般健美操评分系统的基础上增加了健美操资讯的功能,方便用户快速浏览,是一个高效的、动态的、交互友好的健美操评分系统。管理员端的功能主要是开放

短视频源码php

对于php短视频源码而言,视频质量与用户使用体验息息相关,高质量的视频观感更有利于留下用户。但实际上视频质量很容易受到各种因素的影响,接下来我们分析一下php短视频源码中导致视频出现异常的各种原因吧。所谓短视频源码的原生开发,是指在Android、IOS等移动平台上利用官方提供的开发语言、开发类库、开发工具进行App开

java spring cloud 企业工程管理系统源码+二次开发+定制化服务

鸿鹄工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统1.项目背景一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管理的提升提出了更高的要求。二、企业通过

基于TCP的Qt网络通信

目录前言实现原理1.模块添加2.常用接口函数API3.QTcpServer3.1公共成员函数3.1.1构造函数3.1.2给监听的套接字设置监听3.1.3返回监听成功的套接字对象3.2信号4.QTcpSocket4.1公共成员函数4.1.1构造函数4.1.2连接服务器,需要指定服务器端绑定的IP和端口信息4.1.3接收数

CSP-J 2023 入门级 第一轮 阅读程序(1)

【题目】CSP-J2023入门级第一轮阅读程序(1)#include<iostream>#include<cmath>usingnamespacestd;doublef(doublea,doubleb,doublec){doubles=(a+b+c)/2;returnsqrt(s*(s-a)*(s-b)*(s-c));

七天学会C语言-第六天(指针)

1.指针变量与普通变量指针变量与普通变量是C语言中的两种不同类型的变量,它们有一些重要的区别和联系。普通变量是一种存储数据的容器,可以直接存储和访问数据的值。:intnum=10;//定义一个整数型普通变量num,赋值为10在例子中,变量num是一个普通整数变量,它直接存储了值10。指针变量是一种特殊类型的变量,它存储

面试经典刷题)挑战一周刷完150道-Python版本-第2天(22个题)

一、轮转数组给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。这用于旋转一个整数列表nums中的元素。k%=len(nums):这一行的目的是确保k的值在合理的范围内,因为如果k大于列表的长度len(nums),旋转是循环的,所以我们取余数来确保k在合适的范围内,以避免不必要的重复旋转。比如,如

【Java 基础篇】Java网络编程实时数据流处理

在现代计算机应用程序中,处理实时数据流是一项关键任务。这种数据流可以是来自传感器、网络、文件或其他源头的数据,需要即时处理并做出相应的决策。Java提供了强大的网络编程工具和库,可以用于处理实时数据流。本文将详细介绍如何使用Java进行实时数据流处理。什么是实时数据流?实时数据流是一连串持续不断到达的数据,需要及时处理

【UE 粒子练习】08——LOD概述

目录概念应用举例一、检查当前粒子系统中是否设置了LOD二、添加LOD三、LOD设置(单个粒子发射器)四、LOD设置(多个粒子发射器)概念在UnrealEngine中,LOD(LevelofDetail,细节层次)是一种优化技术,用于在不同距离或屏幕空间尺寸下使用不同的模型或网格,以提高性能并减少资源消耗。LOD技术的主

低功耗蓝牙物联网:未来连接的无限可能

物联网是连接各种设备和传感器的网络,其目的是实现信息的交换和共享,提高效率并优化生活。在这个领域,低功耗蓝牙(BLE)正在发挥着越来越重要的作用。低功耗蓝牙是一种无线通信技术,它的主要特点是低功耗和长寿命。在保证纽扣电池长时间使用的同时,BLE的广播模式功耗可以做到1mA以下,进入低功耗模式后甚至可以达到200ua以下

第一个 Go 程序“hello,world“ 与 main 函数

第一个Go程序"hello,world"与main函数文章目录第一个Go程序"hello,world"与main函数一.创建“hello,world”示例程序二.“hello,world”程序结构拆解三、main函数四、Go语言中程序是怎么编译的?一.创建“hello,world”示例程序创建一个叫做main的go文件

热文推荐