Files
2026-05-19 11:30:21 +08:00

387 lines
12 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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}
}