#!/bin/bash BASE_DIR="/data/CzServer/_output.server" DEV_DIR="$BASE_DIR/dev" DLL="$BASE_DIR/OpenCards.Server.DotNetCore.dll" CFG="$DEV_DIR/_launch_server.xml" LOG_DIR="$BASE_DIR/logfile" GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' mkdir -p "$LOG_DIR" check_dotnet() { if ! command -v dotnet &> /dev/null; then echo -e "${RED}[ERROR] dotnet 未找到,请先安装 .NET 5.0${NC}" echo " mkdir -p \$HOME/dotnet && tar zxf dotnet-sdk-5.0.100-linux-x64.tar.gz -C \$HOME/dotnet" echo " export DOTNET_ROOT=\$HOME/dotnet && export PATH=\$PATH:\$HOME/dotnet" exit 1 fi } is_running() { local name=$1 pgrep -f "_launch_server.xml $name" > /dev/null 2>&1 } start_node() { local name=$1 local extra_args=$2 local log_file="$LOG_DIR/${name,,}.log" if is_running "$name"; then echo -e "${YELLOW}[SKIP] $name 已在运行${NC}" return 0 fi echo -e "${GREEN}[START] $name ...${NC}" cd "$DEV_DIR" || exit 1 nohup dotnet "$DLL" "$CFG" $name $extra_args >> "$log_file" 2>&1 & sleep 3 if is_running "$name"; then echo -e "${GREEN}[OK] $name 启动成功 (PID: $(pgrep -f "_launch_server.xml $name"))${NC}" else echo -e "${RED}[FAIL] $name 启动失败,查看日志:$log_file${NC}" tail -20 "$log_file" exit 1 fi } stop_node() { local name=$1 local pid pid=$(pgrep -f "_launch_server.xml $name") if [ -n "$pid" ]; then echo -e "${YELLOW}[STOP] $name (PID: $pid)${NC}" kill "$pid" else echo -e "${YELLOW}[SKIP] $name 未在运行${NC}" fi } status_node() { local name=$1 if is_running "$name"; then local pid pid=$(pgrep -f "_launch_server.xml $name") echo -e "${GREEN}[UP] $name (PID: $pid)${NC}" else echo -e "${RED}[DOWN] $name${NC}" fi } cmd_start() { echo "========================================" echo " 启动游戏服务端" echo "========================================" check_dotnet start_node "NameServer" start_node "PublicNode" start_node "GameNode1" "global.RealmID=1 global.ServerID=1" start_node "AccountNode1" echo "" echo "========================================" echo " 全部节点启动完成" echo "========================================" } cmd_stop() { echo "========================================" echo " 停止游戏服务端" echo "========================================" # 反序停止 stop_node "AccountNode1" stop_node "GameNode1" stop_node "PublicNode" stop_node "NameServer" sleep 2 echo "========================================" echo " 全部节点已停止" echo "========================================" } cmd_restart() { cmd_stop sleep 3 cmd_start } cmd_status() { echo "========================================" echo " 节点状态" echo "========================================" status_node "NameServer" status_node "PublicNode" status_node "GameNode1" status_node "AccountNode1" echo "========================================" } cmd_log() { local name=${1:-NameServer} local log_file="$LOG_DIR/${name,,}.log" if [ -f "$log_file" ]; then tail -f "$log_file" else echo -e "${RED}日志文件不存在:$log_file${NC}" fi } case "$1" in start) cmd_start ;; stop) cmd_stop ;; restart) cmd_restart ;; status) cmd_status ;; log) cmd_log "$2" ;; *) echo "用法: $0 {start|stop|restart|status|log [节点名]}" echo "" echo " start 启动所有节点" echo " stop 停止所有节点" echo " restart 重启所有节点" echo " status 查看各节点状态" echo " log NameServer 实时查看指定节点日志" echo " log PublicNode" echo " log GameNode1" echo " log AccountNode1" exit 1 ;; esac