#/bin/bash # --------------------------------------------------------- # 节点管理工具 # @author yeahoo2000@gmail.com # --------------------------------------------------------- DEBUG=1 # 开发模式设置(0:关闭 1:开启) # 初始化 init(){ cfg_init cfg_check # 节点工作目录 ROOT=${cfg['root']} # 代码库所处目录,例: /data/game.dev CODE_PATH=${cfg['code_path']}/${cfg['ver']} # nginx虚拟主机配置存放目录 if [ -d "/data/conf/nginx/vhost" ]; then VHOST_PATH="/data/conf/nginx/vhost" else VHOST_PATH="/usr/local/webserver/nginx/conf/vhost" fi if [ "${cfg['combine']}" = "" ]; then cfg['combine']='<<"game_23">>' fi # VHOST_PATH="/etc/nginx/sites-enabled" if [ "${cfg['combine']}" = "" ]; then cfg['combine']='<<"game_23">>' fi # erl程序所在路径 ERL=erl if [ -f /opt/erlang/otp19.2/lib/erlang/bin/erl ]; then ERL=/opt/erlang/otp19.2/lib/erlang/bin/erl elif [ -f /usr/local/erlang/bin/erl ]; then ERL=/usr/local/erlang/bin/erl fi # erl节点间连接端口范围 ERL_PORT_MIN=40100 # erl节点间连接端口范围 ERL_PORT_MAX=44000 # 进入节点根目录 cd ${ROOT} || exit 1 } # 配置信息检查 cfg_check(){ if [ -e "${cfg['root']}" ]; then return else if [ "${DEBUG}" != "1" ]; then echo ">> [错误]脚本未进行正确配置,如果希望以开发模式工作请将DEBUG设置为'1',并填写关键配置" exit 1 fi fi # 获取当前脚本文件所在路径,作为根目录 SOURCE="${BASH_SOURCE[0]}" while [ -h "$SOURCE" ]; do DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" done root="$( cd -P "$( dirname "$SOURCE" )" && pwd )" # 调试模式下的默认配置,如有必要请手动修改 # cygwin下需使用dos格式才能正常,如:d:/game.dev/zone/mxfx_local_1 cfg['root']="${root}" # cygwin下需使用dos格式才能正常,如:d:/game.dev cfg['code_path']="/data/sszg_code" cfg['nodename']="dg_game_23@10.148.0.3" cfg['platform']="dg" cfg['zone_id']="1" cfg['type']="zone" cfg['host']="0.0.0.0" cfg['port']="7023" cfg['cookie']="n2su1x83b16,2uw2" cfg['srv_key']="a2bi2Zc89n129BaE3N0" cfg['other_key']="a2bi2Zc89n129BaE3N0" cfg['game_name']="DragonBall" cfg['zone_name']="时空神域开发服" cfg['lang']="zh_CN" cfg['fcm']="0" cfg['db_host']="34.126.183.36" cfg['db_port']="3306" cfg['db_name']="dg_game_23" cfg['logdb_name']="dg_game_23_log" cfg['oss_url']="10.148.0.7:8014" cfg['db_user']="root" cfg['db_pass']="Pass112358" cfg['db_conn_min']="10" cfg['db_conn_max']="30" cfg['ip']="127.0.0.1" cfg['open_time']="1384853886" cfg['website']="http://sksy.cc" # 替换空变量 for k in ${!cfg[@]}; do cfg[$k]=${cfg[$k]/\{\{*\}\}/} done } # 配置信息初始化 cfg_init(){ # 节点根目录 cfg['root']="/data/zone/dg_game_23" # 代码存放路径,每一个版本一个目录保存到此路径下 cfg['code_path']="/data/sszg_code/" # 平台标识 cfg['platform']="dg" # 区号 cfg['zone_id']="1" # 节点类型 cfg['type']="zone" # magic cookie cfg['cookie']="11cyx58dsdmxyTjl08Bxerycw" # 主域名(这里不要带http://) cfg['host']="0.0.0.0" # 合服域名(这里不要带http://) cfg['merge_host']="" # 监听端口 cfg['port']="7023" # 服务器密钥 cfg['srv_key']="713493d68fead22e15dbf0fc4d7b24ad" # 机器所有者 cfg['owner']="诗悦" # 是否禁用 cfg['disabled']="0" # 机器所在地域 cfg['location']="腾讯云" # 外网IP(一般为电信) cfg['ip']="0.0.0.0" # 外网IP1(一般为网通) cfg['ip1']="{{ip1}}" # 外网IP2(其它) cfg['ip2']="{{ip2}}" # 内网IP cfg['ip_internal']="10.148.0.3" # ssh用户名 cfg['ssh_user']="root" # ssh访问端口 cfg['ssh_port']="22" # 节点名称 cfg['nodename']="dg_game_23@10.148.0.3" # 中央服节点名称 cfg['center_node']="dg_center_1@10.148.0.3" # 所在物理机器编号 cfg['machine']="11007" # 该类型节点的扩展信息 cfg['ext']="{{ext}}" # 数据库地址(如果该节点不使用数据库则留空) cfg['db_host']="34.126.183.36" # 数据库端口 cfg['db_port']="3306" # 数据库名称 cfg['db_name']="dg_game_23" # 日志数据库名称 cfg['logdb_name']="dg_game_23_log" # 数据库用户名 cfg['db_user']="root" # 数据库密码 cfg['db_pass']="Pass112358" # 数据库最小连接数 cfg['db_conn_min']="6" # 数据库最大连接数 cfg['db_conn_max']="100" cfg['oss_url']="10.148.0.7:8014" # 当前版本(此版本号用于标识当前版本,由安装工具自动填写) cfg['ver']="h5" # 游戏代号 cfg['game_name']="DragonBall" # 游戏区名称 cfg['zone_name']="Goku-23" # 语言版本 cfg['lang']="zh-CN" # 时区 cfg['timezone']="Asia/Shanghai" # 合服信息 cfg['combine']='' # 开服时间 cfg['open_time']="2021-08-18 16:00:00" # 合服时间 cfg['merge_time']="0" # ssl cfg['ssl']="" # 组ID cfg['group_id']="1" # 是否主服 cfg['is_main']="0" # 是否发送注册码 cfg['need_register']="1" # 是否维护中 cfg['is_maintain']="0" # 日志组别(1:正式 2:海外 其它:测试) cfg['flume_host_group']="1" } # 启动节点 fun_start(){ if [ ! -e dets ]; then echo ">> [错误]当前目录下未安装节点,请先执行安装操作" exit 1 fi if [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -le 0 ]; then #停服更新时对日志做搬移处理 if [ $(cat screenlog.0 | wc -l ) -gt 200000 ]; then echo ">> screenlog.0日志备份清理处理" rm -f screenlog.1 mv screenlog.0 screenlog.1 fi fi if $(in_cygwin); then werl -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} +P 204800 +K true -smp enable -hidden -config sys.config -pa ${CODE_PATH}/server/ebin -name ${cfg['nodename']} -s main start -extra ${cfg['type']} & else start_file=${ROOT}/start.sh CMD="${ERL} -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} +P 204800 +K true -smp enable -hidden -config sys.config -pa ${CODE_PATH}/server/ebin -name ${cfg['nodename']} -s main start -extra ${cfg['type']}" cat > ${start_file} <> 节点 ${cfg['nodename']} 正在启动中,如果想观察启动过程请使用以下命令进行启动:" echo ">> ./ctl.sh start && ./ctl.sh shell" fi } # 清理session fun_clean_sess(){ rm -rf var/sess/* echo "-------------------------------------------" echo ">> php session清理完成" } # 关闭节点 fun_stop(){ if $(in_cygwin); then echo ">> cygwin下不支持此命令" exit fi ${ERL} -noshell -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} -hidden -pa ${CODE_PATH}/server/ebin -name stop_${cfg['nodename']} -setcookie ${cfg['cookie']} -eval "io:setopts([{encoding,unicode}])" -s main stop_from_shell -extra ${cfg['nodename']} fun_clean_sess echo "-------------------------------------------" num=0 while(( $num<30 )); do if [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -gt 0 ]; then log=$(tail -n 10 ${ROOT}/screenlog.0) if [ $(echo $log | grep "type: temporary" | wc -l ) -gt 0 ] || [ $(echo $log | grep "Application inets exited with reason: stopped" | wc -l ) -gt 0 ] || [ $(echo $log | grep "Application main exited with reason: stopped" | wc -l ) -gt 0 ]; then pid=`ps aux | grep "\-name ${cfg['nodename']}"|grep erl|awk '{print $2}'` if [ "$pid" != "" ]; then kill -9 $pid && echo "节点[${cfg['nodename']}]已关闭,直接kill掉进程:$log"; fi exit 0 fi sleep 0.5 let "num++" else echo ">> 节点 ${cfg['nodename']} 关闭完成" exit 0 fi done echo -e ">> 节点 ${cfg['nodename']} \e[91m无法关闭节点,节点还在正常运行中...\e[0;0m" } # 使用remsh方式进入控制台 fun_remsh(){ n=remsh_$1_${cfg['nodename']} ${ERL} -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} -hidden -pa ${CODE_PATH}/server/ebin -name $n -setcookie ${cfg['cookie']} -remsh ${cfg['nodename']} } # 进入该节点的控制台 fun_shell(){ if $(in_cygwin); then echo ">> cygwin下不支持此命令" exit fi screen -r "${cfg['nodename']}" } # 刷新用户名 fun_set_db_user(){ if [ "${cfg['db_user']}" != "root" ]; then echo "更新数据库[${cfg['db_name']}]用户[${cfg['db_user']}]权限" sql="GRANT ALL PRIVILEGES ON ${cfg['db_name']}.* TO '${cfg['db_user']}'@'127.0.0.1' IDENTIFIED BY '${cfg['db_pass']}' WITH GRANT OPTION;" sql="$sql GRANT ALL PRIVILEGES ON ${cfg['db_name']}.* TO '${cfg['db_user']}'@'localhost' IDENTIFIED BY '${cfg['db_pass']}' WITH GRANT OPTION;" sql="$sql FLUSH PRIVILEGES;" mysql -uroot -p$(cat /data/save/mysql_root) -e "$sql" fi } # 安装节点 fun_install(){ if [ -e dets ]; then echo ">> [错误]当前数据目录非空,可能是已经执行过安装过程,请删除后重试" exit 1 fi # 处理模板 tpls=( 'env_zone.cfg' 'vhost.conf' 'main.app' 'env.php' 'default.cfg.php' 'zone.sql' 'log.sql' 'elog.config' 'emysql.app' 'lager.app' 'sys.config' 'goldrush.app' 'ranch.app' ) fun_set_db_user fun_ssl for v in ${tpls[*]};do file="${CODE_PATH}/server/tpl/${v}" if [ ! -e $file ]; then echo ">> [错误]找不到模板文件: ${file}" exit 1 fi # 替换模板变量 lines=$(<"${file}") for k in ${!cfg[@]}; do lines=${lines//\{\{$k\}\}/${cfg[$k]}} done # 替换空变量并生成文件 echo "${lines}" | sed -e "s/{{.*}}//" > ${v} done # 安装数据库 mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -e"create database ${cfg['db_name']}" if [ $? -ne 0 ]; then echo ">> [错误]创建数据库时发生异常" exit 1 fi mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -e"create database ${cfg['logdb_name']}" if [ $? -ne 0 ]; then echo ">> [错误]创建数据库时发生异常" exit 1 fi mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -e"source ${ROOT}/zone.sql" mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['logdb_name']} -e"source ${ROOT}/log.sql" if [ -f "${CODE_PATH}/server/tpl/card.sql" ]; then mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -e"source ${CODE_PATH}/server/tpl/card.sql" fi if [ $? -ne 0 ]; then echo ">> [错误]导入数据库表结构时发生异常" exit 1 fi # 处理相关文件 mkdir -p dets var/sess log/pack log_file role_face_photo/${cfg['platform']}_${cfg['zone_id']} ${CODE_PATH}/web/www/role_face_photo mv env_zone.cfg env.cfg ln -s ${CODE_PATH}/web/www . # ln -s ${CODE_PATH}/server/priv . fun_face_link rm -f zone.sql chmod -R 777 ${cfg['root']}/var echo ">> 正在打开端口:${cfg['port']},如果失败可手动操作完成,无需重新安装" iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport ${cfg['port']} -j ACCEPT && service iptables save && service iptables restart && sysctl -p rm -f sys_notice.sql echo ">> 正在配置web服务器,如果失败可手动操作完成,无需重新安装" rm -f ${VHOST_PATH}/${cfg['host']}.conf && ln -s ${cfg['root']}/vhost.conf ${VHOST_PATH}/${cfg['host']}.conf /root/nginx_reload echo ">> 节点安装完成" } # 删除节点 fun_uninstall(){ fun_check_screen role_num=$(mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -ss -e"select count(*) from role") if [ $? -ne 0 ]; then echo ">> [错误]访问数据库失败,无法获取角色数量" exit 1 fi if [ "$role_num" != "" ] && [ "$role_num" = "$1" ]; then mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -e"drop database ${cfg['db_name']}" mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -e"drop database ${cfg['db_log_name']}" if [ $? -ne 0 ]; then echo ">> [错误]访问数据库失败,无法删除数据库,如需继续请手动操作" exit 1 fi echo ">> 正在关闭端口:${cfg['port']}" iptables -D RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport ${cfg['port']} -j ACCEPT && service iptables save && service iptables restart && sysctl -p rm -rf screenlog.* face replay replay_share dets priv log log_file var www env.cfg env.php default.cfg.php emysql.app main.app vhost.conf start.sh ${VHOST_PATH}/${cfg['host']}.conf ${CODE_PATH}/web/www/face/${cfg['platform']}_${cfg['zone_id']} ${CODE_PATH}/web/www/replay/${cfg['platform']}_${cfg['zone_id']} echo ">> 节点${cfg['nodename']}已经删除" else echo ">> [错误]删除参数中必须带有当前节点的角色数量,角色数量为[${role_num}]" fi } # 热更新节点 fun_update_cfg(){ # 处理模板 tpls=( 'env_zone.cfg' 'vhost.conf' 'elog.config' 'main.app' 'env.php' 'default.cfg.php' ) fun_set_db_user fun_ssl for v in ${tpls[*]};do file="${CODE_PATH}/server/tpl/${v}" # 替换模板变量 lines=$(<"${file}") for k in ${!cfg[@]}; do lines=${lines//\{\{$k\}\}/${cfg[$k]}} done # 替换空变量并生成文件 echo "${lines}" | sed -e "s/{{.*}}//" > ${v} done rm -f env.cfg && mv env_zone.cfg env.cfg rm -f www && ln -s ${CODE_PATH}/web/www . mkdir -p ${cfg['root']}/role_face_photo/${cfg['platform']}_${cfg['zone_id']} ${CODE_PATH}/web/www/role_face_photo fun_face_link /root/nginx_reload if [ $(cat /etc/sysconfig/iptables | grep -e "--dport ${cfg['port']}" | wc -l ) -eq 0 ]; then iptables -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport ${cfg['port']} -j ACCEPT && service iptables save && service iptables restart && sysctl -p fi echo ">> 所有配置文件更新完成" if [ "$1" != "false" ] && [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -gt 0 ]; then fun_exec "sys_env:reload:[]" fi } # 创建所有全服平台目录 fun_create_combine(){ dir=${cfg['root']}/$1 # cfg['combine']='{<<"4399">>,1},{<<"4399">>,2},{<<"4399">>,3},{<<"4399">>,4},{<<"4399">>,5},{<<"4399">>,6},{<<"4399">>,7},{<<"4399">>,8},{<<"4399">>,9}' combinestr=${cfg['combine']} combinestr=${combinestr//\ /} combinestr=${combinestr//\{\<\<\"/} combinestr=${combinestr//\"\>\>\,/\_} combinestr=${combinestr//\}\,/\ } combinestr=( ${combinestr//\}/} ) for k in ${combinestr[@]}; do # echo ${dir}/${k} mkdir -p ${dir}/${k} done } # 更新face链接 fun_face_link(){ for dir in $(ls ${cfg['root']}/role_face_photo); do if [ -d "${cfg['root']}/role_face_photo/${dir}" ] && [ "${dir}" != "." ]; then rm -f ${CODE_PATH}/web/www/role_face_photo/${dir} ln -s ${cfg['root']}/role_face_photo/${dir} ${CODE_PATH}/web/www/role_face_photo/${dir} fi done } # 热更新节点 fun_hotswap(){ noshell="" # shell后台多线程热更要求为noshell if [ "$1" != "" ]; then noshell=" -noshell" fi echo ${CODE_PATH}/server/ebin ${ERL}${noshell} -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} +P 204800 +K true -smp enable -hidden -pa ${CODE_PATH}/server/ebin -name hotswap_${cfg['nodename']} -setcookie ${cfg['cookie']} -eval "io:setopts([{encoding,unicode}])" -s main hotswap_from_shell -extra ${cfg['nodename']} echo ">> 热更新完成" } # 执行指定脚本 fun_exec(){ # 要求传入格式为 Mod:Fun:Args(中间不带空格符号) line=$1 mod=$(echo $line | cut -d':' -f1) fun=$(echo $line | cut -d':' -f2) args=$(echo $line | cut -d':' -f3) args=${args//\#/:} if [[ $(echo $mod | grep "^[a-z0-9_]\{1,50\}$") = "" ]]; then echo ">> [错误]模块名格式不正常:${mod}" exit 1 fi if [[ $(echo $fun | grep "^[a-z0-9_]\{1,50\}$") = "" ]]; then echo ">> [错误]方法名格式不正常:${fun}" exit 1 fi if [[ $(echo $args | grep "^\[.*\]$") = "" ]]; then echo ">> [错误]方法参数格式不正常:${args}" exit 1 fi echo ">> 准备执行方法调用 apply(${mod}, ${fun}, ${args})" ${ERL} -noshell -kernel inet_dist_listen_min ${ERL_PORT_MIN} -kernel inet_dist_listen_max ${ERL_PORT_MAX} -hidden -pa ${CODE_PATH}/server/ebin -name exec_${cfg['nodename']} -setcookie ${cfg['cookie']} -eval "io:setopts([{encoding,unicode}]),io:format(\"return:~w~n\", [rpc:call('${cfg['nodename']}', ${mod}, ${fun}, ${args})])" -s c q } # 清档操作 fun_clean(){ fun_check_screen role_num=$(mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -ss -e"select count(*) from role") if [ $? -ne 0 ]; then echo ">> [错误]访问数据库失败,无法获取角色数量" exit 1 fi if [ "$role_num" != "" ] && [ "$role_num" = "$1" ]; then # 排除列表,注意在排除列表外的所有表将会被清空 exclude=( "mod_notice" "mod_holiday_son" "mod_holiday_total" "mod_white_ip" "sys_notice_board" "mod_white_acc" ) tabs=( $(mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -ss -e"show tables") ) for v in ${tabs[@]}; do flag=0 for v1 in ${exclude[@]}; do if [ "$v" = "$v1" ]; then flag=1 fi done if [ $flag = 0 ]; then sql="${sql} truncate table ${v};" fi done mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -D${cfg['db_name']} -ss -e"${sql}" if [ $? -ne 0 ]; then echo ">> [错误]访问数据库失败" exit 1 fi rm -f ./env.dets mv dets/env.dets ./ rm -f dets/* mv ./env.dets dets/ rm -rf var/sess rm -rf log rm -rf log_file/* rm -rf lager_log/* rm -rf combat_replay/* rm -f screenlog.* rm -rf face/${cfg['platform']}_${cfg['zone_id']}/* rm -rf replay/${cfg['platform']}_${cfg['zone_id']}/* rm -rf replay_share/${cfg['platform']}_${cfg['zone_id']}/* mkdir -p log/pack mkdir -p var/sess chmod -R 777 var/sess echo "" > ./srv_clear_flag.txt echo ">> 清档操作完成" else echo ">> [错误]清档时参数中必须带有当前节点的角色数量,角色数量为[${role_num}]" fi } # 判断运行节点数据库是否还存在 维护辅助工具 fun_run_db(){ if [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -gt 0 ]; then if [ $(mysql -h${cfg['db_host']} -P${cfg['db_port']} -u${cfg['db_user']} -p${cfg['db_pass']} -e "show databases like '${cfg['db_name']}'" | wc -l ) -eq 0 ]; then echo "服务器节点[${cfg['nodename']}]还在运行中,数据库[${cfg['db_name']}]不存在了" exit 1 fi fi } fun_check_screen() { if [ $(screen -ls | grep "${cfg['nodename']}" | wc -l ) -gt 0 ]; then echo "服务器节点[${cfg['nodename']}]还在运行中,不能进行该操作" exit 1 fi } # 收集并打包日志文件 fun_pack(){ cd ${ROOT}/log/pack # 如果目录非空则进行打包 if [ $(ls -al | wc -l) -gt 3 ]; then tar zcf ${ROOT}/log/log_${cfg['platform']}_${cfg['zone_id']}_$(date +"%y%m%d%H%M%S").tar.gz *.txt && rm -f *.txt exit $? fi echo "没有文件可打包" exit 1 } ## fun_ssl(){ if [ "${cfg['platform']}" = "9388" ]; then cfg['ssl']="listen 443 ssl; ssl on; ssl_certificate_key /usr/local/webserver/nginx/conf/wildcard_20131129.key; ssl_certificate /usr/local/webserver/nginx/conf/wildcard.pem;" fi } ## 检测是否在cygwin环境中 in_cygwin(){ os=$(uname) [[ "${os:0:3}" == "CYG" ]]; return $? } ## 命令行帮助 help(){ echo "start 启动节点" echo "stop 关闭节点(同时会自动清理php session)" echo "shell 进入控制台,也可使用screen命令直接进入" echo "remsh 以remsh方式进入控制台" echo "install 安装节点" echo "uninstall 删除节点" echo "clean 清档操作" echo "clean_sess 清理php session,关闭服务器后需清理,不然玩家刷新后可能进入服务器" echo "update_cfg 更新所有配置文件" echo "hotswap 热更新节点" echo "exec 执行指定命令: Mod:Fun:Args" echo "pack 收集并打包日志文件" echo "log 查看控制台日志" echo "check 判断切点是否还在运行中" echo "ls 列出所有的erl节点" echo "run_db 检查节点是否在运行状态但数据库已被删除(维护辅助工具)" } # ------------------------------------------------------ # 执行入口 # ------------------------------------------------------ declare -A cfg init case $1 in start) fun_start;; stop) fun_stop;; shell) fun_shell;; remsh) fun_remsh $2;; install) fun_install;; uninstall) fun_uninstall $2;; clean) fun_clean $2;; clean_sess) fun_clean_sess;; update_cfg) fun_update_cfg $2;; hotswap) fun_hotswap $2;; exec) fun_exec "${2}";; pack) fun_pack;; check) fun_check_screen;; log) less ./screenlog.0;; ls) screen -ls;; nodo) exit 0;; create_dir) fun_create_combine;; run_db) fun_run_db;; *) echo "未知指令,请使用以下有效指令" echo "----------------------------------------------------------" help exit 1 ;; esac exit 0