387 lines
12 KiB
Bash
387 lines
12 KiB
Bash
#!/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}
|
||
}
|
||
|