linux部署java程序启动停止脚本
本脚本使用于java离线lib依赖项目。配置文件位于conf中。
1:启动start
Java jar包启动程序vim start.sh
#!/bin/bash
APP_NAME=name.jar #配置自己的jar包名字
BASE_HOME=$(cd $(dirname $0); pwd)
echo "${BASE_HOME}"
PID=`ps aux|grep ${APP_NAME}|grep -v grep|awk '{print $2}'`
if [ "X$PID" != "X" ] #判断程序运行状态
then
echo "$APP_NAME already started,pid=$PID"
exit 0
fi
#启动方法指定运行的内存、jar包的名称
nohup java
-XX:MetaspaceSize=128M \
-XX:MaxMetaspaceSize=128M \
-Xms1024m -Xmx1024m \
-jar ${APP_NAME} > log.log 2>&1 &
lib和源码分离的启动命令
#!/bin/sh
BASE="$(dirname $(readlink -f $0))" #获取当前程序部署目录
APPNAME=$BASE/
LIB_PATH="$BASE/lib" #获取lib目录
CONF=$BASE/conf #获取conf配置文件目录
APPJAR=KafkaMessToLocal.jar #打包的程序jar包名
if [ ! -d $LIB_PATH ]
then
echo "ERROR:$LIB_PATH not exists"
exit -1
fi
_BASE=${BASE//\//\\\/}
_LIB_PATH=${LIB_PATH//\//\\\/}
PID=`ps aux|grep $APPNAME|grep -v grep|awk '{print $2}'`
if [ "X$PID" != "X" ] #判断程序运行状态
then
echo "$APPNAME already started,pid=$PID"
exit 0
fi
export PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$APPJAR:$CONF #将程序需要的jar,conf配置加载到环境变量中
for i in $BASE/lib/*/*.jar;
do
CLASSPATH="$CLASSPATH":$i;
done
echo $CLASSPATH
nohup java -server -Xms32g -Xmx32g -XX:+UseG1GC -XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M -XX:OnOutOfMemoryError="kill -9 %p"
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:logs/gc.log
-cp $CLASSPATH process.enige &
2:停止stop
vim stop.sh
#!/bin/sh
BASE="$(dirname $(readlink -f $0))" #获取当前程序部署目录和程序运行名
APPNAME=$BASE/
ps aux|grep $APPNAME|grep -v grep|awk '{print $2}'|xargs kill -9
3:一键启停restart
vim restart.sh
其中的BASE_PATH=jar包所在目录
SERVER_NAME=jar包名称
#!/bin/bash
DATE=$(date +%Y%m%d%H%M)
# 基础路径
BASE_PATH=/opt/app/pro
# 服务名称。同时约定部署服务的 jar 包名字也为它。
SERVER_NAME=proc
# 环境
PROFILES_ACTIVE=local
# heapError 存放路径
HEAP_ERROR_PATH=$BASE_PATH/heapError
# JVM 参数
JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"
# SkyWalking Agent 配置
#export SW_AGENT_NAME=$SERVER_NAME
#export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800
#export SW_GRPC_LOG_SERVER_HOST=192.168.0.84
#export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**"
#export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar
# 停止:优雅关闭之前已经启动的服务
function stop() {
echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"
PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
# 如果 Java 服务启动中,则进行关闭
if [ -n "$PID" ]; then
# 正常关闭
echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]"
kill -15 $PID
# 等待最大 120 秒,直到关闭完成。
for ((i = 0; i < 120; i++)); do
sleep 1
PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
if [ -n "$PID" ]; then
echo -e ".\c"
else
echo '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功'
break
fi
done
# 如果正常关闭失败,那么进行强制 kill -9 进行关闭
if [ -n "$PID" ]; then
echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID"
kill -9 $PID
fi
# 如果 Java 服务未启动,则无需关闭
else
echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止"
fi
}
# 启动:启动后端项目
function start() {
# 开启启动前,打印启动参数
echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME"
echo "[start] JAVA_OPS: $JAVA_OPS"
echo "[start] JAVA_AGENT: $JAVA_AGENT"
echo "[start] PROFILES: $PROFILES_ACTIVE"
# 开始启动
nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE >nohup.out 2>&1 &
echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成"
}
# 部署
function deploy() {
cd $BASE_PATH
# 第一步:停止 Java 服务
stop
# 第二步:启动 Java 服务
start
}
deploy
4:部署网站类静态war包项目
war包是一个web模块,可以直接运行,一般开发好的网站,打包后部署到tomcat的网站根目录下,然后重启tomcat,这个包就可以自动解压,相当于代码发布。
war包是java web程序打的包
war包里包括: - 代码编译成的 class文件 - 依赖包 - 配置文件 - html,jsp
步骤:
1、docker部署tomcat
拉取镜像docker pull tomcat:9.0.56-jdk8-temurin-focal
启动:docker run -di --name=tomcat -p 8888:8080 -v /opt/mount/tomcat/webapps:/usr/local/tomcat/webapps tomcat:9.0.56-jdk8-temurin-focal
2、将打包的项目war包上传到/opt/mount/tomcat/webapps目录下
3、重启tomcat:docker restart tomcat
4、访问你的网站,我映射的是8888端口,则网站输入ip:port/后面需要跟上你的war包的名称
5、命名规则:需要注意的点,为了保证访问不报错让war包的login登录首页跳转的页面地址改为和项目名称一样,不然可能出现报错源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表
login.jsp
5:docker部署jar包项目
利用docker file构建镜像实现启动