rebar3 服务器

This commit is contained in:
lwt
2026-05-19 11:30:21 +08:00
parent aeb18acee0
commit 03fd2da480
5187 changed files with 3670646 additions and 0 deletions
+386
View File
@@ -0,0 +1,386 @@
#!/usr/bin/env bash
#-------------------------------------------------
# 命令脚本
# @author lwt
#-------------------------------------------------
# 启动游戏节点
DOC[srv_start]="启动游戏服务器,参数:别名 服务器类型 "
fun_srv_start(){
cd ${ROOT}/server/server
lock_check srv_start_${ALIAS}
INFO "执行命令:rebar3 as ${SERVER_TYPE} ${ALIAS}"
INFO "启动\e[92m${SERVER_TYPE} ${ALIAS}\e[0;0m游戏服务器..."
${REBAR} as ${SERVER_TYPE} ${ALIAS}
lock_release srv_start_${ALIAS}
}
# 关闭游戏节点
DOC[srv_stop]="关闭游戏节点,参数: 服务器id "
fun_srv_stop(){
is_exists_server_id
#关服
SERVER_NODE=`show_server_node ${SERVER_ID}`
INFO "关闭\e[92m${SERVER_NODE}\e[0;0m游戏节点..."
erl_call -c ${DEF_COOKIE} -n ${SERVER_NODE} -a "init stop" &
}
# 关闭游戏节点
DOC[srv_stop_client]="远程节点:参数:服务器id"
fun_srv_stop_client(){
SERVER_NODE="client_server@172.18.160.${SERVER_ID}"
INFO "关闭\e[92m${SERVER_NODE}\e[0;0m游戏节点..."
WERL_NUM=`ps_num ${WERL}`
${ERL} -noshell -name stop_server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -eval "rpc:call('${SERVER_NODE}', init, stop, [])" -s c q
}
# 远程节点
DOC[srv_remsh]="远程节点:参数:服务器id"
fun_srv_remsh(){
is_exists_server_id ${SERVER_ID}
#关服
SERVER_NODE=`show_server_node ${SERVER_ID}`
INFO "连接ip\e[92m${SERVER_NODE}\e[0;0m的游戏节点"
WERL_NUM=`ps_num ${WERL}`
${WERL} -name server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -remsh ${SERVER_NODE} &
}
# 远程节点
DOC[srv_remsh_client]="远程节点:参数:服务器id"
fun_srv_remsh_client(){
SERVER_NODE="client_server@172.18.160.${SERVER_ID}"
INFO "连接ip\e[92m${SERVER_NODE}\e[0;0m的游戏节点"
WERL_NUM=`ps_num ${WERL}`
${WERL} -name server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -remsh ${SERVER_NODE} &
}
# 编译
DOC[srv_make]="编译游戏服务器 参数:服务器id"
fun_srv_make(){
lock_check srv_make
cd ${ROOT}/server/server
SERVER_NODE=`show_server_node ${SERVER_ID}`
INFO "编译热更游戏服务器:\e[92m${SERVER_NODE}\e[0;0m "
${REBAR} as ${DEF_SERVER} compile
lock_release srv_make
}
# 热更
DOC[srv_up_make]="编译游戏服务器 参数:服务器id"
fun_srv_up_make(){
cd ${ROOT}/server/server
SERVER_NODE=`show_server_node ${SERVER_ID}`
INFO "编译热更游戏服务器:\e[92m${SERVER_NODE}\e[0;0m "
erl_call -c node-cookie -n ${SERVER_NODE} -a "r3 compile" &
}
# 分析
DOC[srv_fprof]="生成分析文件: 分析时间"
fun_srv_fprof(){
INFO "生成分析文件..."
if [ "${1}" = "" ]; then
TIME=1
else
TIME=$1
fi
# 生成分享文件
fun_srv_eval ${DEF_SERVER_ID} ms_tool fprof_all [${TIME}]
# 分析文件目录
LOGPATH=d:/work/trunk/server/server/log
# 分析工具安装目录
FENXIPATH=d:/app/erlang_fenxi
# 生成分析文件名称
FILENAME=callgrind.fprof-`server_time`
escript.exe ${FENXIPATH}/erlgrind ${LOGPATH}/fprof.trace ${FILENAME}
mv ${FILENAME} ${FENXIPATH}/log
cd ${FENXIPATH}/qcachegrind074-x86
INFO "生成文件:${FILENAME}"
./qcachegrind.exe ${FENXIPATH}/log/${FILENAME}
}
# 编译
DOC[srv_eval]="指定服务器执行命令: 服务器id M F A "
fun_srv_eval(){
if [ "$2" = "" ]; then
ERR "请输入命令"
exit 1
else
M=$2
fi
if [ "$3" = "" ]; then
ERR "请输入命令"
exit 1
else
F=$3
fi
if [ "$4" = "" ]; then
ERR "请输入命令"
exit 1
else
A=$4
fi
SERVER_NODE=`show_server_node ${SERVER_ID}`
WERL_NUM=`ps_num ${WERL}`
INFO "rpc:call('${SERVER_NODE}', ${M}, ${F}, ${A})"
${WERL} -name eval_server${WERL_NUM}@127.0.0.1 -setcookie ${DEF_COOKIE} -eval "rpc:call('${SERVER_NODE}', ${M}, ${F}, ${A})" -s c q
}
## 生成全量包
DOC[srv_release]="生成全量包"
fun_srv_release()
{
if [ ! -d ${PUB_ROOT} ]; then
mkdir -p ${PUB_ROOT}
fi
LAST_VERSION=`svn_version`
if [ "${REL_VERSION}" = "" ] || [ "${REL_VERSION}" = "0" ]; then
REL_VERSION=${LAST_VERSION}
fi
OPT "========= LAST_VERSION=${LAST_VERSION}, REL_VERSION=${REL_VERSION} ========="
PRJ=`project_pwd`
REL_PACKET=${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz
if [ -f ${REL_PACKET} ]; then
OPT "========= Release package for version ${REL_VERSION} already exists ========="
else
# 删除旧的rebar3执行脚本,一个版本一个脚本可能是为了启动不同版本设置,但我们用不上先删了
CMD "========= remove old packet: rm -rf ${PRJ}/bin/game_server-* ========="
rm -rf ${PRJ}/bin/${SERVER_TYPE}-*
cd ${TMP_SOURCE} || exit 1
OPT "========= Generating release package for version ${REL_VERSION} ========="
CMD "========= ${REBAR} as ${SERVER_TYPE} release ========="
${REBAR} as ${SERVER_TYPE} release || exit 1
CMD "========= ${REBAR} as ${SERVER_TYPE} tar ========="
${REBAR} as ${SERVER_TYPE} tar || exit 1
# 删除旧发版包内容
CMD "========= rm -rf ${PUB_ROOT}/* ========="
rm -rf ${PUB_ROOT}/*
fi
CMD "========= tar -zxf ${REL_PACKET} -C ${PUB_ROOT} ========="
tar -zxf ${REL_PACKET} -C ${PUB_ROOT} || exit 1
# 删除bin下多余的文件,暂时先用手动删除,后面再研究能否用命令来删除
CMD "========= rm -rf ${PUB_ROOT}/bin/${SERVER_TYPE}-* ========="
rm -rf ${PUB_ROOT}/bin/${SERVER_TYPE}-*
cd ${ROOT}
}
## 更新版本包
DOC[srv_update]="更新版本包"
fun_srv_update()
{
if [ ! -d ${PUB_ROOT} ]; then
OPT "${PUB_ROOT} Not exists"
exit 1
fi
PRJ=`project_pwd`
LAST_VERSION=`ls ${PRJ} | grep "game_server-" | sort -rg | head -1 | tr -cd "[0-9]"`
if [ "${PREV_REL_REV}" = "" ] || [ "${PREV_REL_REV}" = "0" ]; then
PREV_REL_REV=${LAST_VERSION}
fi
OPT "========= LAST_VERSION=${LAST_VERSION}, PREV_REL_REV=${PREV_REL_REV} ========="
REL_VERSION=`svn_version`
# 没有新版本可以升级
if [ ${PREV_REL_REV} = ${REL_VERSION} ]; then
OPT "Is latest version, do not need upgrade ..."
exit 1
fi
if [ -z ${PREV_REL_REV} ]; then
OPT "No previous release ${PREV_REL_REV}, skip update package generation...."
exit 1
else
# 删除旧包,有可能是其他版本升级到该版本的包
CMD "========= remove old packet: rm -rf ${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz ========="
rm -rf ${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz
# 删除旧的rebar3执行脚本,一个版本一个脚本可能是为了启动不同版本设置,但我们用不上先删了
CMD "========= remove old packet: rm -rf ${PRJ}/bin/${SERVER_TYPE}-* ========="
rm -rf ${PRJ}/bin/${SERVER_TYPE}-*
CMD "========= cd ${TMP_SOURCE} ========="
cd ${TMP_SOURCE} || exit1
OPT "========= Generating update package for previous version ${PREV_REL_REV} ========="
# 如果版本已经存在,则可能两次升级包基于的版本不同,需要先清理上次版本升级的信息
if [ ${LAST_VERSION} = ${REL_VERSION} ]; then
cmd "========= ${REBAR} as ${SERVER_TYPE} appup clean ========="
${REBAR} as ${SERVER_TYPE} appup clean || exit 1
fi
CMD "========= ${REBAR} as ${SERVER_TYPE} release ========="
${REBAR} as ${SERVER_TYPE} release || exit 1
CMD "========= ${REBAR} as ${SERVER_TYPE} appup generate --previous_version=${PREV_REL_REV} ========="
${REBAR} as ${SERVER_TYPE} appup generate --previous_version=${PREV_REL_REV} || exit 1
CMD "========= ${REBAR} as ${SERVER_TYPE} relup --upfrom=${PREV_REL_REV} --relname=${SERVER_TYPE} --relvsn=${REL_VERSION} ========="
${REBAR} as ${SERVER_TYPE} relup --upfrom=${PREV_REL_REV} --relname=${SERVER_TYPE} --relvsn=${REL_VERSION} || exit 1
CMD "========= ${REBAR} as ${SERVER_TYPE} tar ========="
${REBAR} as ${SERVER_TYPE} tar || exit 1
fi
CMD "========= cp -f ${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz ${PUB_ROOT}/releases/ ========="
cp -f ${PRJ}/${SERVER_TYPE}-${REL_VERSION}.tar.gz ${PUB_ROOT}/releases/
cd ${ROOT}
}
# 发版全量包
DOC[srv_pub]="发版全量包 参数:update or release"
fun_srv_pub()
{
OPT "推送${VER}版本${SERVER_TYPE}升级包到外网"
fun_svn_update
if [ "${1}" = "update" ]; then
fun_srv_update
else
fun_srv_release
fi
if [ $? -ne 0 ]; then
error "生成升级压缩包失败,请检查"
exit 1
fi
cd ${ROOT}
OPT "更新完成,立刻发版${PUBNOW}"
#版署服也放在beta版本中
if [ ${VER} = 'banshu' ]; then
CMD "========= sh ${PUB_CMD} server ${PUSH_LANG} beta ${PLAT} ========="
sh ${PUB_CMD} server ${PUSH_LANG} beta ${PLAT}
else
CMD "========= sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT} ========="
sh ${PUB_CMD} server ${PUSH_LANG} ${VER} ${PLAT}
fi
}
## 重新部署,重启内网测试服
DOC[srv_reboot]="重新部署,重启内网测试服"
fun_srv_reboot(){
OPT "更新重启${VER}版本${SERVER_TYPE}"
if [ ${SERVER_TYPE} = 'login_server' ]; then
BIN_DIR=${SERVER_DIR}/${LOGIN_SERVER}/bin
PUB_ROOT=${SERVER_DIR}/${LOGIN_SERVER}
CONFIG_DIR=${SERVER_DIR}/config/${LOGIN_SERVER}
elif [ ${SERVER_TYPE} = 'game_server' ]; then
BIN_DIR=${SERVER_DIR}/${GAME_SERVER}/bin
PUB_ROOT=${SERVER_DIR}/${GAME_SERVER}
CONFIG_DIR=${SERVER_DIR}/config/${GAME_SERVER}
else
exit 1
fi
fun_svn_update
CMD "========= 停服:srv_stop ========="
fun_srv_stop
CMD "========= rm -rf ${PUB_ROOT}_old ========="
rm -rf ${PUB_ROOT}_old
CMD "========= rm -rf ${PUB_ROOT}/*.dump ========="
rm -rf ${PUB_ROOT}/*.dump
CMD "========= mv ${PUB_ROOT} ${PUB_ROOT}_old ========="
mv ${PUB_ROOT} ${PUB_ROOT}_old
fun_srv_release
CMD "========= rm -rf ${PUB_ROOT}/sys.config ========="
rm -rf ${PUB_ROOT}/sys.config
CMD "========= cp ${CONFIG_DIR}/sys.config ${PUB_ROOT}/sys.config ========="
cp ${CONFIG_DIR}/sys.config ${PUB_ROOT}/sys.config
CMD "========= rm -rf ${PUB_ROOT}/vm.args ========="
rm -rf ${PUB_ROOT}/vm.args
CMD "========= cp ${CONFIG_DIR}/vm.args ${PUB_ROOT}/vm.args ========="
cp ${CONFIG_DIR}/vm.args ${PUB_ROOT}/vm.args
CMD "========= 重启:srv_start ========="
fun_srv_start
cd ${ROOT}
}
# 热更内网测试服
DOC[srv_reload]="热更内网测试服"
fun_srv_reload(){
OPT "热更${VER}版本${SERVER_TYPE}"
if [ ${SERVER_TYPE} = 'login_server' ]; then
BIN_DIR=${SERVER_DIR}/${LOGIN_SERVER}/bin
PUB_ROOT=${SERVER_DIR}/${LOGIN_SERVER}
elif [ ${SERVER_TYPE} = 'game_server' ]; then
BIN_DIR=${SERVER_DIR}/${GAME_SERVER}/bin
PUB_ROOT=${SERVER_DIR}/${GAME_SERVER}
else
exit 1
fi
fun_svn_update
PREV_REL_REV=`ls ${PUB_ROOT}/releases | grep -v RELEASES | grep -v "start_erl.data" | sort -rg | head -1`
REL_VERSION=`svn_version`
if [ ${PREV_REL_REV} = ${REL_VERSION} ]; then
OPT "运行的代码已经是最新版本,无需热更...."
exit 0
fi
fun_srv_update
if [ $? -ne 0 ]; then
error "生成升级压缩包失败,请检查"
exit 1
fi
sh ${BIN_DIR}/${SERVER_TYPE} upgrade ${REL_VERSION}
OPT "热更服务器成功......"
}
# 获取进程数量
ps_num(){
ps -ef | grep ${1} | wc -l
}
# 获取svn版本
svn_version(){
svn info ${TMP_SOURCE} | grep 'Last Changed Rev: ' | cut -d' ' -f4
}
# 获取时间
server_time(){
date +%Y-%m-%d-%H-%M-%S
}
# 获取路径
project_pwd(){
${TMP_SOURCE}/_build/${SERVER_TYPE}/rel/${SERVER_TYPE}
}