start.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #!/bin/bash
  2. BASE_DIR="/data/CzServer/_output.server"
  3. DEV_DIR="$BASE_DIR/dev"
  4. DLL="$BASE_DIR/OpenCards.Server.DotNetCore.dll"
  5. CFG="$DEV_DIR/_launch_server.xml"
  6. LOG_DIR="$BASE_DIR/logfile"
  7. GREEN='\033[0;32m'
  8. RED='\033[0;31m'
  9. YELLOW='\033[1;33m'
  10. NC='\033[0m'
  11. mkdir -p "$LOG_DIR"
  12. check_dotnet() {
  13. if ! command -v dotnet &> /dev/null; then
  14. echo -e "${RED}[ERROR] dotnet 未找到,请先安装 .NET 5.0${NC}"
  15. echo " mkdir -p \$HOME/dotnet && tar zxf dotnet-sdk-5.0.100-linux-x64.tar.gz -C \$HOME/dotnet"
  16. echo " export DOTNET_ROOT=\$HOME/dotnet && export PATH=\$PATH:\$HOME/dotnet"
  17. exit 1
  18. fi
  19. }
  20. is_running() {
  21. local name=$1
  22. pgrep -f "_launch_server.xml $name" > /dev/null 2>&1
  23. }
  24. start_node() {
  25. local name=$1
  26. local extra_args=$2
  27. local log_file="$LOG_DIR/${name,,}.log"
  28. if is_running "$name"; then
  29. echo -e "${YELLOW}[SKIP] $name 已在运行${NC}"
  30. return 0
  31. fi
  32. echo -e "${GREEN}[START] $name ...${NC}"
  33. cd "$DEV_DIR" || exit 1
  34. nohup dotnet "$DLL" "$CFG" $name $extra_args >> "$log_file" 2>&1 &
  35. sleep 3
  36. if is_running "$name"; then
  37. echo -e "${GREEN}[OK] $name 启动成功 (PID: $(pgrep -f "_launch_server.xml $name"))${NC}"
  38. else
  39. echo -e "${RED}[FAIL] $name 启动失败,查看日志:$log_file${NC}"
  40. tail -20 "$log_file"
  41. exit 1
  42. fi
  43. }
  44. stop_node() {
  45. local name=$1
  46. local pid
  47. pid=$(pgrep -f "_launch_server.xml $name")
  48. if [ -n "$pid" ]; then
  49. echo -e "${YELLOW}[STOP] $name (PID: $pid)${NC}"
  50. kill "$pid"
  51. else
  52. echo -e "${YELLOW}[SKIP] $name 未在运行${NC}"
  53. fi
  54. }
  55. status_node() {
  56. local name=$1
  57. if is_running "$name"; then
  58. local pid
  59. pid=$(pgrep -f "_launch_server.xml $name")
  60. echo -e "${GREEN}[UP] $name (PID: $pid)${NC}"
  61. else
  62. echo -e "${RED}[DOWN] $name${NC}"
  63. fi
  64. }
  65. cmd_start() {
  66. echo "========================================"
  67. echo " 启动游戏服务端"
  68. echo "========================================"
  69. check_dotnet
  70. start_node "NameServer"
  71. start_node "PublicNode"
  72. start_node "GameNode1" "global.RealmID=1 global.ServerID=1"
  73. start_node "AccountNode1"
  74. echo ""
  75. echo "========================================"
  76. echo " 全部节点启动完成"
  77. echo "========================================"
  78. }
  79. cmd_stop() {
  80. echo "========================================"
  81. echo " 停止游戏服务端"
  82. echo "========================================"
  83. # 反序停止
  84. stop_node "AccountNode1"
  85. stop_node "GameNode1"
  86. stop_node "PublicNode"
  87. stop_node "NameServer"
  88. sleep 2
  89. echo "========================================"
  90. echo " 全部节点已停止"
  91. echo "========================================"
  92. }
  93. cmd_restart() {
  94. cmd_stop
  95. sleep 3
  96. cmd_start
  97. }
  98. cmd_status() {
  99. echo "========================================"
  100. echo " 节点状态"
  101. echo "========================================"
  102. status_node "NameServer"
  103. status_node "PublicNode"
  104. status_node "GameNode1"
  105. status_node "AccountNode1"
  106. echo "========================================"
  107. }
  108. cmd_log() {
  109. local name=${1:-NameServer}
  110. local log_file="$LOG_DIR/${name,,}.log"
  111. if [ -f "$log_file" ]; then
  112. tail -f "$log_file"
  113. else
  114. echo -e "${RED}日志文件不存在:$log_file${NC}"
  115. fi
  116. }
  117. case "$1" in
  118. start) cmd_start ;;
  119. stop) cmd_stop ;;
  120. restart) cmd_restart ;;
  121. status) cmd_status ;;
  122. log) cmd_log "$2" ;;
  123. *)
  124. echo "用法: $0 {start|stop|restart|status|log [节点名]}"
  125. echo ""
  126. echo " start 启动所有节点"
  127. echo " stop 停止所有节点"
  128. echo " restart 重启所有节点"
  129. echo " status 查看各节点状态"
  130. echo " log NameServer 实时查看指定节点日志"
  131. echo " log PublicNode"
  132. echo " log GameNode1"
  133. echo " log AccountNode1"
  134. exit 1
  135. ;;
  136. esac