#!/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} }