使用Shell脚本对Java应用等服务进行启停控制(支持批量)

news2024/10/22 13:35:31

通过shell脚本对Java服务启停进行控制。支持单个服务和多个服务的 startstopstatusrestart。支持自定义启动命令。(不限于Java服务,适用于各类通过命令行启动的服务)

脚本名称为 runjar.sh , 底部提供源码。通过三部分进行说明:操作说明维护自定义服务列表脚本源码

操作说明
  • 查看可执行的命令 ./runjar.sh

    在这里插入图片描述

  • 启动单个服务 ./runjar.sh start 服务名(已经处于运行状态的服务不会重复运行并提示进程号)

    在这里插入图片描述

    在这里插入图片描述

  • 查看单个服务的运行状态 ./runjar.sh status 服务名

    在这里插入图片描述

  • 停止单个服务 ./runjar.sh stop 服务名

    在这里插入图片描述

  • 批量启动服务 ./runjar.sh start

    在这里插入图片描述

  • 批量停止服务 ./runjar.sh stop

    在这里插入图片描述

  • 批量查看各个服务的状态 ./runjar.sh status

    在这里插入图片描述

维护自定义服务列表
  1. 新建 runjar.txt 文件放到 runjar.sh 脚本的同级目录。

  2. 自定义服务的启动命令 启动命令 === 自定义服务名称 ,每个服务占据一行,启动命令和自定义服务名之间用 === 隔开,所有的启停操作通过自定义的服务名称进行。例如:

    /home/jdk1.8/bin/java -jar /home/myjar/jarzip.jar === jarzip
    /home/jdk1.8/bin/java -jar /home/myjar/jarzip2.jar === myzip
    
脚本源码
#!/bin/bash
function getcmdbyline(){
    command=`echo $1 | awk 'BEGIN {FS="==="} {print $1}' | tr -d '\r\n' | tr -d '\n'`
    echo $command
}
function getappid(){
    id=`echo $1 | awk 'BEGIN {FS="==="} {print $2}' | tr -d '\r\n' | tr -d '\n'` # 防止使用 CRLF文件出现的问题
    echo $(echo $id)
}
CONFIG_FILE="./runjar.txt" # 可自定义配置文件名称
function getcmdbyfile(){ 
    cat $CONFIG_FILE | while read line || [[ -n ${line} ]] 
    do
        command=`getcmdbyline "$line"`
        appid=`getappid "$line"`
        if [ $appid == $1 ]
        then
            echo $command
            break
        fi
    done
}


function isrunning(){
    cmd=`getcmdbyfile $1`
    if [ -n "$cmd" ]
    then
        num=`ps aux|grep "$cmd" | wc -l`
        if [ $num -gt 1 ]
        then 
            ps -ef | grep "$cmd" | grep -v grep | grep -v "$0" | awk '{print $2}' 
        fi
    fi
}
function operservice(){
    if [ $1 == "start" ]
    then 
        echo "start $2..."
        cmd=`getcmdbyfile $2`
        if [ -n "$cmd" ]
        then
            isrun=`isrunning $2`
            if [ -n "$isrun" ]
            then
                echo "app is already running, don't start again , service id is $isrun"
            else
                nohup ${cmd} 2>&1 & > null
                echo "done"
            fi
        else
            echo "not found cmd"
        fi
    fi

    if [ $1 == "stop" ]
    then 
        echo "stop $2..."
        isrun=`isrunning $2`
        if [ -n "$isrun" ]
        then
            kill -9 $isrun
            echo "kill done"
        else
            echo "app not run, not need to kill"
        fi
        
    fi
  
    if [ $1 == "restart" ]
    then 
        echo "restart $2"
        cmd=`getcmdbyfile $2`
        if [ -n "$cmd" ]
        then
            isrun=`isrunning $2`
            if [ -n "$isrun" ]
            then
                kill -9 $isrun
                echo "stop done"
            fi
            nohup ${cmd} 2>&1 &
            echo "start done"
        else
            echo "not found cmd, please config."
        fi

    fi

    if [ $1 == "status" ]
    then 
        echo "status $2"
        isrun=`isrunning $2`
        if [ -n "$isrun" ]
        then
           echo "app is running , service id is $isrun"
        else
            echo "app not running."
        fi
    fi
}

if [ ! -n "$1" ]
then 
    echo "Usage: ./runjar { start | stop | restart | status }"
else
    if [ ! -n "$2" ]
    then
        cat $CONFIG_FILE | while read line || [[ -n ${line} ]]
        do
           
            # command=`getcmdbyline "$line"` # 将 $line 整体作为一个参数
            appid=`getappid "$line"`
            echo "####### $appid #######"
            operservice $1 $appid
            echo "done"
        done
    else
        operservice $1 $2
    fi
fi

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

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

相关文章

【Dv2Admin】Django配置线上ws反向代理

在 Web 应用程序的部署过程中,安全性、稳定性和实时通信是开发者们普遍关注的重点。Django 是一个非常流行的 Web 框架,常与 Nginx 配合使用,以便实现反向代理、负载均衡以及 SSL 加密等功能。除此之外,实时功能(如 WebSocket)也是现代应用中经常使用的技术。 在项目中实…

用户一键注册登录(一)- 对接短信平台

1. 流程图 2. 详细设计 2.1 用户表结构设计 CREATE TABLE users (id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,mobile varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 手机号,nickname varchar(16) CHARACT…

回忆Web编程的岁月变迁

目录 引子 记忆的片断 CGI / ISAPI 何为 CGI / ISAPI ? 一个小插曲 ASP与我的ASP Builder ASP编程技术 何为 Windows DNA ? 什么是 COM ? ASP.NET 什么是 ActiveX ? IntraBuilder与我的InterBuilder 结尾 引子 凌晨三点醒了,大多的时候是…

数据结构(JAVA)JDK17语法新增特性

目录 yield关键字var关键字空指针异常密封类接口中的私有方法instanceof其他 yield关键字 yield关键字用于case的代码块中返回值。 正常switch语句 public static void main(String[] args) {int result 0;String str "a";switch (str) {case "a" :resu…

根据发生异常的汇编指令以及函数调用堆栈,从内存的角度出发,估计出问题的可能原因,确定排查方向,快速定位C++软件问题

目录 1、前言 2、初步分析dump文件 3、加载更多模块的pdb文件,可能能看到更多行的函数调用堆栈 4、从内存的角度去看,估计是访问了野指针导致的,沿着这个怀疑的方向快速地定位了问题 5、最后 C软件异常排查从入门到精通系列教程&#xf…

【安当产品应用案例100集】024-BYOE及BYOK在IaaS场景中的应用

在云计算环境中,尤其是涉及到敏感数据时,企业用户可能会选择自带加密工具或密钥(即BYOE或BYOK),以确保数据在传输和存储过程中的安全性。这种方式可以防止云服务提供商访问或泄露加密数据,增强数据保护。 …

离散数学 第二讲 特殊集合和集合间关系 笔记 [电子科大]王丽杰

1.2 特殊集合与集合间关系 空集 不含任何元素的集合叫做空集(empty set),记作∅. 空集可以符号化为 ∅ { x ∣ x ≠ x } ∅ \{ x|x ≠ x\} ∅{x∣xx} . 空集是绝对唯一的。 全集 针对一个具体范围,我们考虑的所有对象的集合叫做全集(universal se…

基于springboot招聘信息管理系统设计与实现(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

视频美颜平台是如何搭建的?基于直播美颜SDK源码的开发技术详解

今天,笔者将详细讲解如何基于直播美颜SDK源码搭建视频美颜平台的技术路径。 一、理解视频美颜技术 视频美颜技术主要通过图像处理算法对视频流进行实时处理,包括肤色优化、瑕疵修复、面部特征增强等。实现这一目标需要高效的图像处理算法和稳定的实时渲…

5个最流行的图像嵌入模型对比

最近需要研究图像相似性搜索。我想知道基于架构训练方法的嵌入之间是否存在差异。但是,很少有博客比较几种模型之间的嵌入。因此,在这篇博客中,我将使用 Flickr 数据集 [6] 比较 EfficientNet [1]、ViT [2]、DINO-v2 [3]、CLIP [4] 和 BLIP-2…

Matlab软件进行金融时间序列数据的描述性统计代码

1、数据S&P500的收盘价格,return100*log(pt/pt-1) 方法1:用python代码 import numpy as np import pandas as pddef calculate_log_returns(prices):"""计算价格序列的对数收益率。参数:prices (numpy.array): 价格序列。返回:log_…

Mongodb基础用法【总结】

关系型数据库和非关系型数据库的区别 关系型数据库 1.在关系型数据库中,数据都是存储在表中的,对存储的内容有严格的要求 2.因为我们在创建表的时候久已经规定了表中的字段 存储的数据类型 是否为空 唯一标识等规则 3.由于操作的都是结构化的数据&#…

家政小程序搭建,数字化市场发展下的意义

家政服务行业作为当下社会生活中不可或缺的行业,需求量在逐渐增加,行业发展也趋向多样化。 随着数字化的浪潮,家政行业逐渐向数字化、智能化升级发展,推动行业高质量发展,迎合现代化发展趋势,这一转型为行…

83.【C语言】数据结构之顺序表的尾部插入和删除

目录 3.操作顺序表 2."伪"插入顺序表的元素 分析尾部插入函数SLPushBack 代码示例 SeqList.h main.c free(指针)出错的几种可能的原因 3."伪"删除顺序表元素 2.分析尾部删除函数SLPopBack 代码示例 错误检查 两种解决办法 1.判断size是否为负…

004-按照指定功能模块名称分组

按照指定功能模块名称分组 一、说明1.现在有一个需求:2.具体做法 二、代码案例三、效果展示 一、说明 1.现在有一个需求: 需要把一个功能模块的几个功能点放在同一个文档目录下,这几个功能点分布在不同的 Controller 2.具体做法 需要把他…

如何将markdown文件转换为pdf

最近笔者在用vscode写markdown,但是提交时往往需要交pdf。所以就涉及到如何将markdown转化为pdf格式。 首先,需要在vscode上安装插件 markdown Preview Enhanced 之后在vscode的右上角即可看到下述图标,点击,vscode右半面就会显示…

C++数据结构-图的存储及邻接矩阵的代码实现

1. 什么是图 图论(graph theory) 是数学的一个分支,它以 图 为研究的对象。 图论本身是应用数学的一部分,历史上图论曾经被很多数学家各自独立建立过。关于图论的最早文字记载最早出现在欧拉 1736 年的论著中,也就是…

2024年有哪些开放式耳机值得入手?开放式耳机排行榜10强

随着技术的不断进步与消费者需求的日益多样化,开放式耳机凭借其独特的优势——如保持对周围环境的感知、减少对耳道的压力等,逐渐成为市场上的一大热点。尤其是在健康意识不断提升的今天,开放式耳机不仅为音乐爱好者提供了全新的聆听体验&…

【C++语言】全面掌握const的用法

一、const 需要怎么理解?? const修饰的变量不能够再作为左值,初始化完成之后,值不能被修改 1.1 C语言的const const 修饰的量,可以不用初始化,不叫常量,叫做常变量。 void main() {const int…

Windows git 配置

需要在git-bash的目录下,配置.ssh 的配置文件 要 .ssh 目录下的配置无法使用