因为项目的要求,需要用到自动化部署的shell脚本,这里来发篇文章记录一下,方便自己可以码哈哈哈哈!!
在确认使用前要先确认自己的项目是否是lib依赖分离的项目哦,up主是lib/conf/bin三层,当然你们也可以自行修改一下配置里面的路径。如果不会可以先看我的另一片文章,一键打包然后解压bin.zip就可以使用啦!https://www.jianshu.com/p/66b586c9cc36
大概就是这样,这个脚本适用于所有的服务,但是一定要注意一下哈。
yml文件里面要配置一下启动类名的相对路径哦SERVER_MAIN_NAME=com...*.application
#!/bin/bash
#有的时候没有给权限这个一定要加,不然java环境变量会没有配置
source /etc/profile
#表示ENV环境输入(配置中心)
ENV=$1
#BIN_DIR(脚本文件路径)、DEPLOY_DIR(工程路径)、CONF_DIR(配置文件路径)
cd `dirname $0`
BIN_DIR=`pwd`
cd ..
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR/config
echo $DEPLOY_DIR
PIDS=0
echo $PIDS
#获取SERVER_NAME(服务名)、SERVER_PORT(服务端口)
#这里的配置自己改,sed是为了获取yaml后面的value值如果是properties文件把正则:改成=号就可以用了
#当然如果为了方便可以写个自动检测什么配置文件更改这一段话哈哈。我就不贴出来自己想吧哈
SERVER_NAME=`sed '/ name/!d;s/.*://' config/application.yml | tr -d '\r'`
SERVER_PORT=`sed '/port/!d;s/.*://' config/application.yml | tr -d '\r'`
SERVER_MAIN_NAME=`sed '/SERVER_NAME_MAIN/!d;s/.*://' config/application.yml | tr -d '\r'`
#若未设置服务名,用hostname替代
if [ -z "$SERVER_NAME" ]; then
SERVER_NAME=`hostname`
fi
#判断服务是否已经在运行
checkpids(){
echo '判断服务是否已经在运行'
PIDS=`ps -ef | grep java | grep "$CONF_DIR" |awk '{print $2}'`
if [ -n "$PIDS" ]; then
echo "ERROR: The $SERVER_NAME has already started!"
echo "PID: $PIDS"
exit 1
fi
}
# exit 0
# 查看端口是否已被占用
if [ -n "$SERVER_PORT" ]; then
echo '查看端口是否已被占用'
SERVER_PORT_COUNT=`netstat -tln | grep $SERVER_PORT | wc -l`
if [ $SERVER_PORT_COUNT -gt 0 ]; then
echo "ERROR: The $SERVER_NAME port $SERVER_PORT has already used!"
exit 1
fi
fi
#获取工程jar的lib目录
LIB_DIR=$DEPLOY_DIR/lib
LIB_JARS=`ls $LIB_DIR|grep .jar|awk '{print "'$LIB_DIR'/"$0}'|tr "\n" ":"`
# Java配置(系统缺少了显示设备、键盘或鼠标|禁用IPV6|L5so文件路径)
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Djava.library.path=${LIB_DIR}"
# JVM配置(Heap最大值|Heap初始值|Young Generation的heap大小|Perm Generation 的最小值|线程栈大小|禁用FullGC|并发收集|减少mark的时间|防止Memory Fragmention|最大分页大小|get,set 方法转成本地代码|在old generation 在使用了初始化的比例后 concurrent collector 启动收集|在 old generation 在使用了 n% 的比例后 , 启动 concurrent collector)
JAVA_MEM_OPTS=" -server -Xmx2g -Xms1g -Xmn256m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "
#禁用JVM的DNS缓存机制
NET_OPTS=" -Dsun.net.inetaddr.ttl=0 -Dnetworkaddress.cache.ttl=0 "
#启动服务(后台运行且不被挂断)
echo -e "启动 $SERVER_NAME ..............\c"
#echo "nohup java -cp $NET_OPTS $JAVA_OPTS $JAVA_MEM_OPTS -classpath $CONF_DIR:$LIB_JARS $SERVER_MAIN_NAME > /dev/null 2>&1 &"
if [ -z $ENV ]; then
checkpids
nohup java $NET_OPTS $JAVA_OPTS $JAVA_MEM_OPTS -classpath $CONF_DIR:$LIB_JARS $SERVER_MAIN_NAME >/dev/null 2>&1 &
echo '等待15s'
sleep 15
PIDS=`ps -ef | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
if [[ $PIDS -ne 0 ]]; then
echo "(pid=$PIDS) [OK]"
exit 0
else
echo "(pid=$PIDS) [Failed]"
exit 1
fi
else
checkpids
nohup java $NET_OPTS $JAVA_OPTS $JAVA_MEM_OPTS -classpath $CONF_DIR:$LIB_JARS $SERVER_MAIN_NAME --spring.profiles.active=$ENV > /dev/null 2>&1 &
PIDS=`ps -ef | grep java | grep "$DEPLOY_DIR" | awk '{print $2}'`
if [[ $PIDS -eq 0 ]]; then
echo "(pid=$PIDS) [Failed]"
exit 1
else
echo "(pid=$PIDS) [OK]"
exit 0
fi
fi
用着不错的请给我一个赞哈,里面的jvm相关配置请通过调试后自行修改哦,不然内存溢出了自己看着办。