Shell脚本管理Java应用程序的高效方法

 更新时间:2024年09月29日 10:15:59   作者:不掉头发的阿水  
在软件开发中,管理和监控 Java 应用程序的运行状态变得愈加重要,本文将分享一个自用的简单但高效的 Shell 脚本,帮助轻松管理 JAR 包的启动、停止和日志管理,需要的朋友可以参考下

脚本功能概述

本脚本提供以下主要功能:

  • 检查 JAR 包的运行状态
  • 启动尚未运行的 JAR 包
  • 停止所有运行中的 JAR 包
  • 删除 10 天之前的旧日志,并压缩近期日志

详细代码讲解

以下是脚本的主要部分,我们将逐段分析其实现逻辑。

  • 创建日志目录

# 创建日志目录
[ ! -d "./logs" ] && mkdir ./logs
  • 此部分确保在脚本运行时创建一个日志目录,以便存储后续生成的日志文件。

  • 检查进程状态

check_status() {
    for filename in $filenames; do
        pid=$(ps -ef | grep $filename | grep -v grep | awk '{print $2}')
        if [ -z "$pid" ]; then
            echo "$filename: 该服务未启动"
        else
            echo "$filename: 该服务正在运行 (PID为: $pid)"
        fi
    done
}
  • 该函数循环遍历当前目录下的所有 JAR 包,使用 ps 命令检查它们的运行状态。如果没有找到相应的 PID,则表示服务未启动。

  • 日志清理与压缩

# 删除10天之前的日志文件
delete_old_logs() {
    find ./logs -type f -name "*.log" -mtime +10 -exec rm {} \;
    echo "已删除10天之前的日志文件"
}
 
# 压缩10天内的老日志
compress_old_logs() {
    find ./logs -type f -name "*.log" -mtime -10 -exec gzip {} \;
    echo "已压缩10天内的老日志文件"
}
  • 这两部分负责清理和压缩日志文件,确保日志目录不会占用过多空间,保持整洁。

  • 停止进程

stop_all() {
    for filename in $filenames; do
        echo -e "\n------------------------------------------------------"
        echo "尝试优雅停止 $filename 进程"
        ps -ef | grep $filename | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill
        sleep 3
        echo "检查是否有未终止的 $filename 进程,强制结束"
        ps -ef | grep java | grep $filename | grep -v grep | awk '{print $2}' | xargs -r kill -9
        echo "$filename 程序已经停止"
    done
}
  • stop_all 函数尝试优雅地停止所有进程,如果未能成功,则强制结束它们,确保所有服务都已停止。

  • 脚本参数处理

case "$1" in
    status)
        check_status
        ;;
    free)
        for filename in $filenames; do
            ...
        done
        ;;
    stop)
        stop_all
        ;;
    *)
        ...
        ;;
esac
  • 此部分根据用户输入的参数执行不同的操作,如查看状态、启动或停止服务。

使用示例

要使用该脚本,可以在终端中运行以下命令:

  • 重启所有JAR包:./your_script.sh
  • 查看 JAR 包状态:./your_script.sh status
  • 启动未运行的 JAR 包:./your_script.sh free
  • 停止所有 JAR 包:./your_script.sh stop

注意事项

在运行脚本之前,请确保您拥有足够的权限,并检查脚本中的路径设置,避免权限或路径错误导致的运行失败。

总结

通过这个简单的 Shell 脚本,您可以高效地管理 Java 应用程序的运行状态,确保日志文件的整洁。希望您能根据自己的需求进行修改和扩展,让脚本更符合您的工作流程。

附录完整代码

完整代码:

#!/bin/bash
 
# 创建日志目录
[ ! -d "./logs" ] && mkdir ./logs
 
# 获取当前目录下所有的 jar 文件名
filenames=$(ls *.jar)
echo "获取当前目录下所有的 jar 包文件名"
 
# 定义函数:检查进程状态
check_status() {
    for filename in $filenames; do
        pid=$(ps -ef | grep $filename | grep -v grep | awk '{print $2}')
        if [ -z "$pid" ]; then
            echo "$filename: 该服务未启动"
        else
            echo "$filename: 该服务正在运行 (PID为: $pid)"
        fi
    done
}
 
# 删除10天之前的日志文件
delete_old_logs() {
    find ./logs -type f -name "*.log" -mtime +10 -exec rm {} \;
    echo "已删除10天之前的日志文件"
}
 
# 压缩10天内的老日志
compress_old_logs() {
    find ./logs -type f -name "*.log" -mtime -10 -exec gzip {} \;
    echo "已压缩10天内的老日志文件"
}
 
# 定义函数:停止所有进程
stop_all() {
    for filename in $filenames; do
        echo -e "\n------------------------------------------------------"
        echo "尝试优雅停止 $filename 进程"
        ps -ef | grep $filename | grep -v grep | awk '{print $2}' | xargs --no-run-if-empty kill
        sleep 3
        echo "检查是否有未终止的 $filename 进程,强制结束"
        ps -ef | grep java | grep $filename | grep -v grep | awk '{print $2}' | xargs -r kill -9
        echo "$filename 程序已经停止"
    done
}
 
# 判断脚本参数
case "$1" in
    status)
        echo "后缀status 查看当前文件夹下所有jar运行状态"
        check_status
        ;;
    free)
        echo "后缀free 启动尚未启动的 jar 包"
        for filename in $filenames; do
            pid=$(ps -ef | grep $filename | grep -v grep | awk '{print $2}')
            if [ -z "$pid" ]; then
                logname=$(basename $filename .jar)
                timestamp=$(date +"%Y%m%d_%H%M%S")
                echo "开始启动 $filename"
                nohup java -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=200m -jar $filename >> ./logs/outlog_${logname}_$timestamp.log 2>&1 &
                echo "启动 $filename 结束,日志输出到 ./logs/outlog_${logname}_$timestamp.log"
            else
                echo "$filename: 已在运行,跳过启动"
            fi
        done
        ;;
    stop)
        stop_all
        ;;
    *)
        echo "进行默认选项,重新启动所有 jar 包(可通过status后缀查看状态、free启动未运行jar服务,stop停止当前目录下所有jar包服务)"
        stop_all
		# 执行日志清理和压缩
		delete_old_logs
		compress_old_logs
        for filename in $filenames; do
            sleep 2
            logname=$(basename $filename .jar)
            timestamp=$(date +"%Y%m%d_%H%M%S")
            echo "开始启动 $filename"
            nohup java -server -Xms1024m -Xmx1024m -XX:MetaspaceSize=200m -jar $filename >> ./logs/outlog_${logname}_$timestamp.log 2>&1 &
            sleep 2
            echo "启动 $filename 结束,日志输出到 ./logs/outlog_${logname}_$timestamp.log"
        done
        ;;
esac
 
 

以上就是Shell脚本管理Java应用程序的高效方法的详细内容,更多关于Shell脚本管理Java程序的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot的application.yml不生效问题及解决

    SpringBoot的application.yml不生效问题及解决

    这篇文章主要介绍了SpringBoot的application.yml不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java中计算集合的交差并集示例代码

    java中计算集合的交差并集示例代码

    今天突然想Java如何计算集合的交差并集,主要是看Python语言的时候想起来的。下面这篇文章主要给大家介绍了关于java中计算集合的交差并集的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • jdbc实现用户注册功能代码示例

    jdbc实现用户注册功能代码示例

    这篇文章主要介绍了jdbc实现用户注册功能,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • java编写简易贪吃蛇游戏

    java编写简易贪吃蛇游戏

    这篇文章主要为大家详细介绍了java编写简易贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 基于@RequestParam注解之Spring MVC参数绑定的利器

    基于@RequestParam注解之Spring MVC参数绑定的利器

    这篇文章主要介绍了基于@RequestParam注解之Spring MVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • SpringBoot登录用户权限拦截器

    SpringBoot登录用户权限拦截器

    这篇文章主要介绍了SpringBoot登录用户权限拦截器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Spring注解之@Import注解的使用和源码分析

    Spring注解之@Import注解的使用和源码分析

    今天主要介绍Spring @Import注解,在Spring中@Import使用得比较频繁,它得作用是导入bean,具体的导入方式有多种,特别在SpringBoot项目中,很多地方都使用到了@Import注解,感兴趣的小伙伴可以参考阅读
    2023-04-04
  • MyBatisPlus 主键策略的实现(4种)

    MyBatisPlus 主键策略的实现(4种)

    MyBatis Plus 集成了多种主键策略,帮助用户快速生成主键,本文主要介绍了MyBatisPlus主键策略的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • springboot aspect通过@annotation进行拦截的实例代码详解

    springboot aspect通过@annotation进行拦截的实例代码详解

    这篇文章主要介绍了springboot aspect通过@annotation进行拦截的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 通过idea创建Spring Boot项目并配置启动过程图解

    通过idea创建Spring Boot项目并配置启动过程图解

    这篇文章主要介绍了通过idea创建Spring Boot项目并配置启动过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论