You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
zeus/framework/shells/misc_scripts/lnx_logic_serverctrl.sh

700 lines
18 KiB
Bash

# linux script server control logic functions encapsulation.
# Longwei Lai
###################################################################
source "${____FWK_SCRIPT_PATH}/lnx_fwk_path.sh"
source "${____FWK_SCRIPT_PATH}/lnx_fwk_server.sh"
source "${____LOGIC_SCRIPT_PATH}/lnx_logic_defs.sh"
source "${____LOGIC_SCRIPT_PATH}/lnx_logic_serverhttp.sh"
source "${____LOGIC_SCRIPT_PATH}/lnx_logic_serversql.sh"
source "${____LOGIC_SCRIPT_PATH}/lnx_logic_serverconf.sh"
source "${____LOGIC_SCRIPT_PATH}/lnx_logic_serverstatus.sh"
function server_ctrl_cmd_adapt()
{
local args=($@)
local cmd=${args[0]}
local cmd_type=${cmd%%_*}
local server_type=${cmd#*_}
local ctrl_args=${args[@]:1}
if [ "${server_type}" = "status" -o "${server_type}" = "st" -o\
"${server_type}" = "logic_status" -o "${server_type}" = "logic_st" ]; then
local tmp=${cmd_type}
cmd_type=${server_type}
server_type=${tmp}
fi
case "${cmd_type}" in
start)
server_ctrl_start ${server_type} ${ctrl_args}
;;
stop)
server_ctrl_stop ${server_type} ${ctrl_args}
;;
safestop)
server_ctrl_safestop ${server_type} ${ctrl_args}
;;
restart)
server_ctrl_restart ${server_type} ${ctrl_args}
;;
status)
server_ctrl_status ${server_type} ${ctrl_args}
;;
logic_status)
server_ctrl_logic_status ${server_type} ${ctrl_args}
;;
set)
server_ctrl_set ${server_type} ${ctrl_args}
;;
*)
list_help
return 0
;;
esac
}
function server_ctrl_start()
{
local args=($@)
local server_type=${args[0]}
local start_args=${args[@]:1}
case "${server_type}" in
devilserver)
start_gameserver ${start_args}
;;
ruinsserver)
start_gameserver ${start_args}
;;
gameserver)
start_gameserver ${start_args}
;;
pyramidserver)
start_gameserver ${start_args}
;;
legendserver)
start_gameserver ${start_args}
;;
cloudserver)
start_gameserver ${start_args}
;;
loginserver)
start_loginserver ${start_args}
;;
globalserver)
start_globalserver ${start_args}
;;
webserver)
start_webserver ${start_args}
;;
*)
log_err "unknown server[${server_type}], start server failed"
return 1
;;
esac
}
function server_ctrl_stop()
{
local args=($@)
local server_type=${args[0]}
local stop_args=${args[@]:1}
case "${server_type}" in
devilserver)
stop_gameserver ${stop_args}
;;
ruinsserver)
stop_gameserver ${stop_args}
;;
gameserver)
stop_gameserver ${stop_args}
;;
pyramidserver)
stop_gameserver ${stop_args}
;;
legendserver)
stop_gameserver ${stop_args}
;;
cloudserver)
stop_gameserver ${stop_args}
;;
loginserver)
stop_loginserver ${stop_args}
;;
globalserver)
stop_globalserver ${stop_args}
;;
webserver)
stop_webserver ${stop_args}
;;
*)
log_err "unknown server[${server_type}], stop server failed"
return 1
;;
esac
}
function server_ctrl_safestop()
{
local args=($@)
local server_type=${args[0]}
local stop_args=${args[@]:1}
case "${server_type}" in
devilserver)
safestop_gameserver ${stop_args}
;;
ruinsserver)
safestop_gameserver ${stop_args}
;;
gameserver)
safestop_gameserver ${stop_args}
;;
pyramidserver)
safestop_gameserver ${stop_args}
;;
legendserver)
safestop_gameserver ${stop_args}
;;
cloudserver)
safestop_gameserver ${stop_args}
;;
loginserver)
safestop_loginserver ${stop_args}
;;
globalserver)
safestop_globalserver ${stop_args}
;;
webserver)
safestop_webserver ${stop_args}
;;
*)
log_err "unknown server[${server_type}], safestop server failed"
return 1
;;
esac
}
function server_ctrl_restart()
{
local args=($@)
local server_type=${args[0]}
local restart_args=${args[@]:1}
case "${server_type}" in
devilserver)
restart_gameserver ${restart_args}
;;
ruinsserver)
restart_gameserver ${restart_args}
;;
gameserver)
restart_gameserver ${restart_args}
;;
pyramidserver)
restart_gameserver ${restart_args}
;;
legendserver)
restart_gameserver ${restart_args}
;;
cloudserver)
restart_gameserver ${restart_args}
;;
loginserver)
restart_loginserver ${restart_args}
;;
globalserver)
restart_globalserver ${restart_args}
;;
webserver)
restart_webserver ${restart_args}
;;
*)
log_err "unknown server[${server_type}], restart server failed"
return 1
;;
esac
}
function server_ctrl_status()
{
local args=($@)
local server_type=${args[0]}
local list_args=${args[@]:1}
case "${server_type}" in
devilserver)
list_gameserver_status ${list_args}
;;
ruinsserver)
list_gameserver_status ${list_args}
;;
gameserver)
list_gameserver_status ${list_args}
;;
pyramidserver)
list_gameserver_status ${list_args}
;;
legendserver)
list_gameserver_status ${list_args}
;;
cloudserver)
list_gameserver_status ${list_args}
;;
loginserver)
list_loginserver_status ${list_args}
;;
globalserver)
list_globalserver_status ${list_args}
;;
webserver)
list_webserver_status ${list_args}
;;
*)
log_err "unknown server[${server_type}], restart server failed"
return 1
;;
esac
}
function server_ctrl_logic_status()
{
local args=($@)
local server_type=${args[0]}
local list_args=${args[@]:1}
case "${server_type}" in
gameserver)
echo "gameserver logic status:"
echo "`get_gameserver_logic_status`"
;;
pyramidserver)
echo "pyramidserver logic status:"
echo "`get_gameserver_logic_status`"
;;
legendserver)
echo "legendserver logic status:"
echo "`get_gameserver_logic_status`"
;;
devilserver)
echo "devilserver logic status:"
echo "`get_gameserver_logic_status`"
;;
cloudserver)
echo "cloudserver logic status:"
echo "`get_gameserver_logic_status`"
;;
*)
echo "${server_type} logic status: Unknown"
;;
esac
}
function server_ctrl_set()
{
local args=($@)
local server_type_and_set_type=${args[0]}
local list_args=${args[@]:1}
case "${server_type_and_set_type}" in
gameserver_logic_status|pyramidserver_logic_status|legendserver_logic_status|devilserver_logic_status)
set_gameserver_logic_status ${list_args}
;;
*)
log_info "for now, not support <${server_type_and_set_type}> command!"
;;
esac
}
function start_gameserver()
{
echo "game start config";
check_app_type "gs"
local args=$@
local server_entry="${FRAMEWORK_PATH}/skynet/skynet"
local start_file="${SVR_PATH}/${____START_FILE_GAME}"
local result_file="${SVR_PATH}/${____START_RESULT_FILE_GAME}"
start_server_and_wait "${____LOGIC_GAME}" "${server_entry}" "${____APP_START_CONF_NAME}" "${start_file}" "${result_file}" ${args}
}
function stop_gameserver()
{
local args=$@
stop_server "${____LOGIC_GAME}" ${args}
local start_file="${SVR_PATH}/${____START_FILE_GAME}"
remove_server_start_file "${start_file}"
}
function restart_gameserver()
{
local args=$@
stop_gameserver ${args}
echo "Sleep 5 second..."
sleep 5
start_gameserver ${args}
}
function list_gameserver_status()
{
local args=$@
list_server_status "${____LOGIC_GAME}" ${args}
}
function start_loginserver()
{
echo "login start config";
check_app_type "ls"
local args=$@
local server_entry="${FRAMEWORK_PATH}/skynet/skynet"
local start_file="${SVR_PATH}/${____START_FILE_LOGIN}"
local result_file="${SVR_PATH}/${____START_RESULT_FILE_LOGIN}"
start_server_and_wait "${____LOGIC_LOGIN}" "${server_entry}" "${____APP_START_CONF_NAME}" "${start_file}" "${result_file}" ${args}
}
function stop_loginserver()
{
local args=$@
stop_server "${____LOGIC_LOGIN}" ${args}
local start_file="${SVR_PATH}/${____START_FILE_LOGIN}"
remove_server_start_file "${start_file}"
}
function restart_loginserver()
{
local args=$@
stop_loginserver $args
echo "Sleep 5 second..."
sleep 5
start_loginserver $args
}
function list_loginserver_status()
{
local args=$@
list_server_status "${____LOGIC_LOGIN}" ${args}
}
function auto_update_db()
{
local arg_env=`cat ${____APP_START_CONF_NAME} | grep app_env | awk -F\" '{print $2}'`
if [[ ${arg_env} == "dev" ]] || [[ ${arg_env} == "sit" ]]; then
local dbconf_name=dbconf.lua
sh ${MISC_SCRIPTS_PATH}/lnx_logic_updatedb.sh ${dbconf_name}
fi
}
function start_globalserver()
{
echo "global start config";
check_app_type "ms"
auto_update_db
local args=$@
local server_entry="${FRAMEWORK_PATH}/skynet/skynet"
local start_file="${SVR_PATH}/${____START_FILE_GLOBAL}"
local result_file="${SVR_PATH}/${____START_RESULT_FILE_GLOBAL}"
start_server_and_wait "${____LOGIC_GLOBAL}" "${server_entry}" "${____APP_START_CONF_NAME}" "${start_file}" "${result_file}" ${args}
}
function stop_globalserver()
{
local args=$@
stop_server "${____LOGIC_GLOBAL}" ${args}
local start_file="${SVR_PATH}/${____START_FILE_GLOBAL}"
remove_server_start_file "${start_file}"
}
function restart_globalserver()
{
local args=$@
stop_globalserver $args
echo "Sleep 5 second..."
sleep 5
start_globalserver $args
}
function list_globalserver_status()
{
local args=$@
list_server_status "${____LOGIC_GLOBAL}" ${args}
}
function check_app_type() {
cat ${____APP_START_CONF_NAME};
local tar_type=${1}
local app_type=`cat ${____APP_START_CONF_NAME} | grep app_type | awk -F\" '{print $2}'`
if [[ "${app_type}" != "${tar_type}" ]]; then
echo "app_type[${app_type}] error"
exit 1
fi
}
function start_webserver()
{
echo "web start config";
check_app_type "ws"
local args=$@
local server_entry="${FRAMEWORK_PATH}/skynet/skynet"
local start_file="${SVR_PATH}/${____START_FILE_WEB}"
local result_file="${SVR_PATH}/${____START_RESULT_FILE_WEB}"
start_server_and_wait "${____LOGIC_WEB}" "${server_entry}" "${____APP_START_CONF_NAME}" "${start_file}" "${result_file}" ${args}
}
function stop_webserver()
{
local args=$@
stop_server "${____LOGIC_WEB}" ${args}
local start_file="${SVR_PATH}/${____START_FILE_WEB}"
remove_server_start_file "${start_file}"
}
function restart_webserver()
{
local args=$@
stop_webserver $args
echo "Sleep 5 second..."
sleep 5
start_webserver $args
}
function list_webserver_status()
{
local args=$@
list_server_status "${____LOGIC_WEB}" ${args}
}
function start_server_and_wait()
{
local server_name="$1"
local server_entry="$2"
local server_config_file="$3"
local start_file="$4"
local result_file="$5"
# parse arguments and get server start args
local args=($@)
local start_args="${args[@]:5}"
# remove start result file first
\rm -rf "${result_file}"
\rm -rf "${start_file}"
# start loginserver
start_server "${server_name}" "${server_entry}" ${server_config_file} ${start_args}
local start_ret=$?
if [ ${start_ret} -ne 0 ]; then
echo -n "Start ${server_name} failed(error code: 1)" > "${result_file}"
return 1
fi
# sleep 0.618 seconds, and then wait server login success
sleep 0.618
# wait loginserver start file
wait_server_start_file ${server_name} "${start_file}"
if [ $? -ne 0 ]; then
log_err "Wait server start file failed, start ${server_name} failed!"
\rm -rf "${start_file}" # force cleanup start file again
echo -n "Start ${server_name} failed(error code: 2)" > "${result_file}"
return 2
fi
echo -n "Start ${server_name} success" > "${result_file}"
log_info "done!"
}
function wait_server_start_file()
{
local server_name="$1"
local start_file="$2"
local begin_wait=`date "+%s"`
local wait_time=0
local temp_file=".${server_name}.temp"
log_info "wait for the ${server_name} to generate the startup successfully file..."
while [ ! -f "${start_file}" ]; do
echo -n "`list_server_status "${server_name}"`" > "${temp_file}"
if egrep "Stopped" "${temp_file}" > /dev/null; then
log_err "${server_name} stopped, failed to start server!"
\rm -rf "${temp_file}"
return 1
fi
sleep 10
wait_time=$((${wait_time} + 10))
log_info "wait for the ${server_name} to generate the startup successfully file(${wait_time} seconds)..."
if [ ${wait_time} -ge ${____GAME_SERVER_START_MAX_WAIT} ]; then
log_err "wait for the ${server_name} startup time too long, kill it!"
\rm -rf "${temp_file}"
stop_server "${____LOGIC_GAME}"
\rm -rf "${start_file}"
return 2
fi
done
\rm -rf "${temp_file}"
\rm -rf "${start_file}"
return 0
}
function remove_server_start_file()
{
local start_file="$1"
\rm -rf "${start_file}"
}
function debugcontrol()
{
local port=${1}
local commond=${2}
exec 3<>/dev/tcp/127.0.0.1/${port}
if [ $? -ne 0 ]; then
log_err ${commond} "failed"
return 1
fi
echo "${commond}" >&3
while read -r line
do if [[ "$line" == "<CMD OK>" || "$line" == "<CMD Error>" ]]; then
log_info "send ${commond}" $line;
break;
fi done <&3;exec 3<&-;exec 3>&-;
return 0
}
function safestop_loginserver()
{
local nodeid="`get_serverconf_loginnode_id`"
local port="`exec_sql_cmd_on_confdb "SELECT port FROM conf_debug WHERE nodeid = ${nodeid}"`"
debugcontrol ${port} "safestop exitlog"
local args=$@
stop_loginserver ${args}
}
function safestop_globalserver()
{
local nodeid="`get_serverconf_globalnode_id`"
local port="`exec_sql_cmd_on_confdb "SELECT port FROM conf_debug WHERE nodeid = ${nodeid}"`"
debugcontrol ${port} "safestop exitlog"
local args=$@
stop_globalserver ${args}
}
function safestop_webserver()
{
local nodeid="`get_serverconf_webnode_id`"
local port="`exec_sql_cmd_on_confdb "SELECT port FROM conf_debug WHERE nodeid = ${nodeid}"`"
debugcontrol ${port} "safestop exitlog"
local args=$@
stop_webserver ${args}
}
function safestop_gameserver()
{
# check running or not
local gs_st="`list_gameserver_status`"
if `list_gameserver_status | egrep 'Stopped' > /dev/null`; then
log_warn "gameserver not running"
return 0
fi
# set gameserver status to maintain
set_gameserver_logic_status 2
if [ $? -ne 0 ]; then
log_err "send gameserver status to <maintain> failed!"
log_err "safe stop gameserver failed!"
return 1
fi
# get telnet port
log_info "get telnet port..."
local gamenode_id="`get_serverconf_gamenode_id`"
local telnet_port="`exec_sql_cmd_on_confdb "SELECT port FROM conf_debug WHERE nodeid = ${gamenode_id}"`"
log_info "telnet port got: ${telnet_port}"
# wait all agentlt services count down to 10 or less(we use python telnetlib standard lib to implement telnet access)
local max_agentlt_count=20
local temp_pycode_file=".safestop_temp_pycode_file"
echo -e "from telnetlib import Telnet\nt = Telnet('127.0.0.1', ${telnet_port})\nt.write('list\\\n')\nagentlt_svcs_count = len([agentlt_svc for agentlt_svc in t.read_until('OK', 120).split('\\\n') if 'agentlt' in agentlt_svc])\nprint agentlt_svcs_count" > "${temp_pycode_file}"
local check_agentlt_ok=FALSE
local begin_check_time=`date "+%s"`
local max_check_time=${____GAME_SERVER_STOP_MAX_WAIT}
while [ "${check_agentlt_ok}" != "TRUE" ]; do
local used_time=$((`date "+%s"` - ${begin_check_time}))
if [ ${used_time} -ge ${max_check_time} ]; then
log_err "wait <agentlt services count> down to ${max_agentlt_count} or less timeout(used: ${used_time})!"
log_err "safe stop gameserver failed!"
return 1
fi
local now_agentlt_svcs_count="`python "${temp_pycode_file}"`"
if [ $? -ne 0 ]; then
log_err "failed to get server <agentlt services> count, telnet error!"
log_err "safe stop gameserver failed!"
return 2
fi
log_info "wait for <agentlt services> count down to ${max_agentlt_count} or less(now: ${now_agentlt_svcs_count}, used ${used_time} seconds)..."
if [ "${now_agentlt_svcs_count}" -lt 10 ]; then
check_agentlt_ok=TRUE
else
sleep 3
fi
done
rm -rf "${temp_pycode_file}"
# wait 5 seconds, and then execute kill
log_info "wait 5 seconds, and then execute force stop..."
sleep 5
debugcontrol ${telnet_port} "safestop exitlog"
local args=$@
stop_gameserver ${args}
}