开发小运维-jar包服务shell启动脚本
现在大多数企业都基本会构建docker镜像去部署java应用服务,但是有些特殊场景可能需要我们手动去启动某个java服务包,本章主要介绍如何编写一个脚本去启动java服务
脚本功能简介
1、启动脚本存放的路径为/data
2、编译好的jar包存放路径为/data/tencent_video/app
3、每个服务的路径为/data/tencent_video/service/服务名,该路径存放备份的jar包或者application.yml以及日志
4、执行启动脚本执行启动服务后,
(1)会将编译好的jar包备份到每个服务的对应路径,
(2)查询是该服务是否有存在进程,存在则停止该服务的进程
(3)执行对应的jar包启动命令
脚本内容
#!/bin/bash# 记录开始时间
start_time=$(date +%s)echo "执行脚本"PROJECT=${1:-all}
ALIYUN_REPO_TAG=$(date +%Y%m%d%H%M%S)
PROJ_LIST="task,report,gateway,order,user,information"echo "项目: $PROJECT"# 处理后端项目
function handle_jar_project() {local project=$1local jar_file_pattern=$2local nohup_params=$3# 使用通配符查找 JAR 文件jar_file=$(ls /data/tencent_video/app/$jar_file_pattern 2>/dev/null | tail -n 1)old_jar_file=$(ls /data/tencent_video/service/$project/$jar_file_pattern 2>/dev/null | tail -n 1) local jar_file_name=$(basename $jar_file)local old_jar_file_name=$(basename $old_jar_file)echo "查找到的 JAR 文件: $jar_file"echo "确保video-$PROJECT-*.jar 只有一个"if [ -f "$jar_file" ]; thenecho "备份文件为 /data/tencent_video/service/$project/$ALIYUN_REPO_TAG-$old_jar_file_name,请自行进入 /data/tencent_video/app/$project/ 删除"mv /data/tencent_video/service/$project/$old_jar_file_name /data/tencent_video/service/$project/$ALIYUN_REPO_TAG-$old_jar_file_namecp $jar_file /data/tencent_video/service/$project/if [ $? -eq 0 ]; thenecho "文件已成功拷贝到 /data/tencent_video/service/$project/"PID=$(pgrep -f $old_jar_file_name)echo "找到运行中的进程,进程ID为: $PID"if [[ -n "$PID" ]]; thenecho "找到运行中的进程,进程ID为: $PID,现在将其终止."kill -9 $PID#wait $PID 2>/dev/nullecho "进程已终止."elseecho "未找到运行中的进程."fiecho "启动新的进程: nohup /usr/local/jdk-17.0.2/bin/java $nohup_params -jar /data/tencent_video/service/$project/$jar_file_name >> /data/tencent_video/service/$project/logs/app.log 2>&1 &"cd /data/tencent_video/service/$project/nohup /usr/local/jdk-17.0.2/bin/java $nohup_params -jar /data/tencent_video/service/$project/$jar_file_name >> /data/tencent_video/service/$project/logs/app.log 2>&1 &echo "新的 $project 进程已启动."elseecho "拷贝文件失败"fielseecho "文件 $jar_file 不存在, 没有新文件直接重启"PID=$(pgrep -f $old_jar_file_name)echo "进程ID为: $PID"if [[ -n "$PID" ]]; thenecho "找到运行中的进程,进程ID为: $PID,现在将其终止."kill -9 $PID echo "进程已终止."fiecho "启动新的进程: nohup /usr/local/jdk-17.0.2/bin/java $nohup_params -jar /data/tencent_video/service/$project/$old_jar_file_name >> /data/tencent_video/service/$project/logs/app.log 2>&1 &"cd /data/tencent_video/service/$projectnohup /usr/local/jdk-17.0.2/bin/java $nohup_params -jar /data/tencent_video/service/$project/$old_jar_file_name >> /data/tencent_video/service/$project/logs/app.log 2>&1 &echo "新的 $project 进程已启动."fi
}# 处理特定项目
case $PROJECT intask|order|report|information)handle_jar_project "$PROJECT" "video-$PROJECT-*.jar" "--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED -Dspring.config.location=application.yml";;gateway|user)handle_jar_project "$PROJECT" "video-$PROJECT-*.jar" "-Dspring.config.location=application.yml";;*)echo "[ERROR]: Cannot find proj_name: ${PROJECT}, please check it first."echo "Allowed proj_name list: [${PROJ_LIST}].";;
esac# 记录结束时间
end_time=$(date +%s)# 计算脚本执行时间
elapsed_time=$((end_time - start_time))echo "脚本总耗时: $elapsed_time 秒"
启动脚本
[root@kksc-01 data]# ./tencent_video_start.sh task