#!/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