启动、关闭、重启、查看jar包进程的脚本

#!/bin/bash

# 文件当前所在目录
current_path="$PWD"
# 使用的jar包名称
target_jar="XXXXXX.jar"
# 日志文件的前缀
log_file_prefix="serverlog"
# 归档日志文件前缀
log_file_prefix_archive="arc"
# 日志文件后缀
log_file_suffix=".log"
# 日志文件基础目录
log_base_path="logs"
# 运行日志文件所在目录
log_dir="${log_base_path}/run_env"
# gc日志文件所在目录
gc_dir="${log_base_path}/gc"
# java运行参数
java_parameter="-Xms1g -Xmx2g"
# 在运行日志中打印GC信息
# java_parameter="${java_parameter} -XX:+PrintGCDetails"
java_parameter="${java_parameter} -XX:+HeapDumpOnOutOfMemoryError"
# java_parameter="${java_parameter} -Dxxl.job.executor.port=7088"
java_parameter="${java_parameter} -Dlogging.level.root=info"
java_parameter="${java_parameter} -Xlog:gc:./$gc_dir/gc${log_file_suffix}"

process_info=""
process_id=""

show() {
    echo "jar包名称:${target_jar}"
    echo "jar包启动参数:${java_parameter}"
    echo "日志文件前缀:${log_file_prefix}"
    echo "运行日志文件存储路径:${log_dir}"
    echo "gc日志文件存储路径:${gc_dir}"
    exit 1
}

usage() {
    echo "受支持的指令:$0 [show|start|stop|restart|help|status] "
}

status() {

    # 使用ps -elf命令查找包含目标Java程序的进程信息,通过管道传递给grep筛选
    # 这里根据定义好的变量来进行准确匹配
    process_info=$(ps -elf | grep ${target_jar} | grep -v grep)

    # 先判断没找到对应进程的情况
    if [ -z "$process_info" ]; then
        # 如果没找到对应的进程,输出异常日志,并直接退出
        echo "错误:未发现正在运行的${target_jar}服务"
        exit 1
    else
        process_id=$(echo "$process_info" | awk '{print $4}')
        # process_command=$(echo "$process_info" | awk '{print $0}')
        echo "发现正在运行的${target_jar}服务,进程号:${process_id}"
    fi
}

stop() {
    # 检查启动的shell脚本是否存在,不存在则报错退出
    if [ -f "$target_jar" ]; then

        status

        # 先判断没找到对应进程的情况
        if [ -z "$process_info" ]; then
            # 如果没找到对应的进程,输出异常日志,并直接退出
            echo "未发现正在运行的${target_jar}服务"
            exit 1
        fi

        # 安全检查,使用process_id再次查询一下是否是target_jar的进程,防止杀错进程
        verify_info=$(ps -elf | grep ${process_id} | grep ${target_jar} | grep -v grep)
        if [ -z "$verify_info" ]; then
            echo "${process_info}"
            echo "通过进程ID'${process_id}'查询时未发现包含'${target_jar}'的相关进程信息,与预期不符,可能存在异常,请检查!"
            exit 1
        else
            echo "确认进程ID ${process_id} 与 ${target_jar} 相符"
        fi

        # 输出关闭前的日志信息
        echo "准备关闭正在运行的${target_jar}服务,进程号:${process_id}"

        # 使用kill -9强制关闭进程
        kill -9 $process_id

        # 输出关闭后的日志信息
        echo "已成功强制关闭${target_jar}服务,进程号:${process_id}"

        return 0
    else
        # 如果不存在,打印异常信息
        echo "错误:${target_jar}文件不存在,请检查jar包文件是否在当前目录下!"
        # 退出当前脚本,返回非零值表示出现异常(这里返回值可以根据实际情况自定义,通常非零表示异常)
        exit 1
    fi
}

start() {
    # 获取传入的jar包名称参数
    jar_name=$target_jar
    # 判断指定的jar包是否存在,若不存在则打印提示信息并退出
    if [ -f $jar_name ]; then

        # 检查并创建运行日志目录
        if [ ! -d $log_dir ]; then
            mkdir -p $log_dir
        fi

        # 检查并创建gc日志目录
        if [ ! -d $gc_dir ]; then
            mkdir -p $gc_dir
        fi

        # 获取当前日期,格式为%Y%m%d
        current_date=$(date +%Y%m%d)
        # 日志文件的基础名称,以log_file_prefix+下划线开头,加上当前日期后缀
        log_base_name="${log_file_prefix}_${current_date}"

        # 先按照基础名称构建日志文件
        log_file="${log_dir}/${log_base_name}${log_file_suffix}"

        # 归档后的日志文件
        archive_log_file="${log_file_prefix_archive}_${log_base_name}"

        cd $log_dir
        echo "进入${log_dir}执行命令"

        # 找到相同前缀与后缀的文件
        for file in ${log_file_prefix}*; do
            # 找到与日志文件相同前缀的文件
            if [[ $file == *${log_file_suffix} ]]; then
                i=1
                # 构建新的文件名,将新前缀和原文件名拼接
                new_file_name="${log_file_prefix_archive}_${file}.${i}"
                  # 判断日志文件是否已经存在,如果存在则输出提示信息
                if [ -f $new_file_name ]; then
                    # 查找是否已经存在同名的日志文件,若存在则处理重命名
                    new_log_file_with_suffix="${log_file_prefix_archive}_${file}.${i}"
                    while [ -f $new_log_file_with_suffix ]; do
                        i=$((i + 1))
                        new_log_file_with_suffix="${log_file_prefix_archive}_${file}.${i}"
                    done
                    echo "日志文件‘${file}’已经存在,重命名并存储为:${new_log_file_with_suffix}"
                    mv ${file} ${new_log_file_with_suffix}
                else
                    echo "日志文件‘${file}’已经存在,重命名并存储为:${new_file_name}。"
                    mv ${file} ${new_file_name}
                fi
            fi
        done

        cd $current_path
        echo "返回 ${current_path}"

        # # 判断日志文件是否已经存在,如果存在则输出提示信息
        # if [ -f $log_file ]; then

        #     # 查找是否已经存在同名的日志文件,若存在则处理重命名
        #     i=1
        #     new_log_file_with_suffix="${log_dir}/${archive_log_file}_${i}${log_file_suffix}"
        #     while [ -f $new_log_file_with_suffix ]; do
        #         i=$((i + 1))
        #         new_log_file_with_suffix="${log_dir}/${archive_log_file}_${i}${log_file_suffix}"
        #     done
        #     echo "日志文件‘${log_file}’已经存在,重命名并存储在:${new_log_file_with_suffix}"
        #     mv $log_file $new_log_file_with_suffix
        # fi

        # 使用nohup启动jar包,并将日志输出到指定的日志文件中
        nohup java $java_parameter -jar $jar_name > $log_file &

        sleep 1
        echo "Jar包 $jar_name 已通过nohup方式启动,日志输出到 $log_file"

        echo "等待5秒,查询运行状态"
        sleep 5

        status
    else
        echo "错误:jar包 $jar_name 不存在,请检查文件名或目录是否正确。"
        exit 1
    fi
}

restart() {
    stop

    if [ $? -eq "0" ]; then
        # 暂停一秒
        sleep 1

        start
    else
        echo "${target_jar} 服务停止失败,新版本启动中止"
        exit 1
    fi
}


#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"restart")
restart
;;
"status")
status
;;
"show")
show
;;
"help")
usage
;;
*)
echo "不支持的指令 $1"
usage
;;
esac

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值