start.sh 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #!/bin/bash
  2. set -e # 遇到错误时退出
  3. echo "=========================================="
  4. echo "SteamCMD容器启动中..."
  5. echo "时间: $(date)"
  6. echo "=========================================="
  7. # 启动cron服务并设置crontab任务
  8. setup_crontab() {
  9. # 检查是否启用自动更新
  10. if [ "${ENABLE_AUTO_UPDATE:-true}" != "true" ]; then
  11. echo "自动更新已禁用 (ENABLE_AUTO_UPDATE=false)"
  12. return
  13. fi
  14. echo "设置crontab自动更新任务..."
  15. # 启动cron服务
  16. service cron start
  17. # 创建日志目录
  18. mkdir -p /var/log
  19. touch /var/log/updatemod.log
  20. chmod 666 /var/log/updatemod.log
  21. # 获取更新间隔(默认15分钟)
  22. local interval="${UPDATE_INTERVAL:-15}"
  23. # 设置crontab任务
  24. echo "*/$interval * * * * /opt/updatemod.sh >> /var/log/updatemod.log 2>&1" | crontab -
  25. # 验证crontab任务
  26. echo "当前crontab任务列表:"
  27. crontab -l
  28. echo "crontab自动更新任务设置完成!"
  29. echo "任务将每${interval}分钟自动运行一次 /opt/updatemod.sh"
  30. echo "日志文件位置: /var/log/updatemod.log"
  31. }
  32. copy_files() {
  33. local mod_path=$1
  34. local parent_path=$2
  35. local lower_addons_path="${mod_path}/addons"
  36. local upper_addons_path="${mod_path}/Addons"
  37. local lower_keys_path="${mod_path}/keys"
  38. local upper_keys_path="${mod_path}/Keys"
  39. # 处理addons目录
  40. if [ -d "$lower_addons_path" ]; then
  41. find "$lower_addons_path" -type f -name '*.bisign' -exec cp -dpf {} "$parent_path/addons/" \;
  42. elif [ -d "$upper_addons_path" ]; then
  43. find "$upper_addons_path" -type f -name '*.bisign' -exec cp -dpf {} "$parent_path/addons/" \;
  44. fi
  45. # 处理keys目录
  46. if [ -d "$lower_keys_path" ]; then
  47. find "$lower_keys_path" -type f -name '*.bikey' -exec cp -dpf {} "$parent_path/keys/" \;
  48. elif [ -d "$upper_keys_path" ]; then
  49. find "$upper_keys_path" -type f -name '*.bikey' -exec cp -dpf {} "$parent_path/keys/" \;
  50. fi
  51. }
  52. start_dayzserver() {
  53. cd /root/Steam/steamapps/common/DayZServer
  54. # 启动服务器之前,检查mod是否有更新.
  55. updatemodpath="/root/Steam/steamapps/workshop/content/221100"
  56. target_dir="/root/Steam/steamapps/common/DayZServer/client_mod"
  57. find "$updatemodpath" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d $'\0' mod_dir; do
  58. meta_file=$(find "$mod_dir" -type f -name "meta.cpp" -print -quit)
  59. if [[ -f "$meta_file" ]]; then
  60. mod_name=$(grep -oP 'name\s*=\s*"\K[^"]*' "$meta_file")
  61. if [[ -n "$mod_name" ]]; then
  62. symlink_path="${target_dir}/@${mod_name}"
  63. if [[ ! -L "$symlink_path" ]]; then
  64. echo "为 [$mod_name] 创建软链接: $symlink_path → $mod_dir"
  65. ln -s "$mod_dir" "$symlink_path"
  66. else
  67. echo "软链接已存在: $symlink_path, 跳过创建"
  68. fi
  69. else
  70. echo "警告: 在 $meta_file 中未找到 name 字段"
  71. fi
  72. else
  73. echo "警告: 在 $mod_dir 中未找到 meta.cpp 文件"
  74. fi
  75. done
  76. # 初始化mod变量
  77. client_mods=""
  78. server_mods=""
  79. # 处理客户端mod(使用 -xtype d)
  80. while IFS= read -r -d $'\0' folder; do
  81. echo "处理客户端mod: $folder"
  82. copy_files "$folder" "."
  83. if [ -n "$client_mods" ]; then
  84. client_mods="${client_mods};"
  85. fi
  86. client_mods="${client_mods}$(basename "$folder")" # 只保留目录名
  87. done < <(find "./client_mod" -xtype d -name '@*' -print0)
  88. # 处理服务端mod
  89. while IFS= read -r -d $'\0' folder; do
  90. echo "处理服务端mod: $folder"
  91. copy_files "$folder" "."
  92. if [ -n "$server_mods" ]; then
  93. server_mods="${server_mods};"
  94. fi
  95. server_mods="${server_mods}$(basename "$folder")"
  96. done < <(find "./server_mod" -xtype d -name '@*' -print0)
  97. echo "客户端MODS: $client_mods"
  98. echo "服务端MODS: $server_mods"
  99. # 崩溃检测和自动重启循环
  100. while true; do
  101. echo "=========================================="
  102. echo "启动DayZServer..."
  103. echo "时间: $(date)"
  104. echo "端口: ${DAYZ_SERVER_PORT}"
  105. echo "CPU核心数: ${DAYZ_CPU_COUNT}"
  106. echo "客户端mod: ${client_mods}"
  107. echo "服务端mod: ${server_mods}"
  108. echo "=========================================="
  109. echo "执行命令: ./DayZServer -port=${DAYZ_SERVER_PORT} -cpuCount=${DAYZ_CPU_COUNT} -config=serverDZ.cfg -profiles=profiles -mission=./mpmissions/${DAYZ_MISSIONS} -mod=${client_mods} -servermod=${server_mods}"
  110. # 启动DayZServer并捕获退出状态
  111. ./DayZServer -port=${DAYZ_SERVER_PORT} -cpuCount=${DAYZ_CPU_COUNT} \
  112. "-config=serverDZ.cfg" "-profiles=profiles" \
  113. "-mission=./mpmissions/${DAYZ_MISSIONS}" \
  114. "-mod=${client_mods}" "-servermod=${server_mods}" &
  115. # 保存进程ID
  116. DAYZ_PID=$!
  117. echo "DayZServer进程ID: $DAYZ_PID"
  118. # 等待进程结束
  119. wait $DAYZ_PID
  120. EXIT_CODE=$?
  121. echo "=========================================="
  122. echo "DayZServer已退出"
  123. echo "退出代码: $EXIT_CODE"
  124. echo "时间: $(date)"
  125. echo "=========================================="
  126. # 检查是否正常退出(退出代码0通常表示正常退出)
  127. if [ $EXIT_CODE -eq 0 ]; then
  128. echo "DayZServer正常退出,将在5秒后重启..."
  129. sleep 5
  130. echo "重新启动DayZServer..."
  131. else
  132. echo "DayZServer异常退出,将在5秒后重启..."
  133. sleep 5
  134. echo "重新启动DayZServer..."
  135. fi
  136. done
  137. }
  138. # 检查并安装SteamCMD
  139. if [ ! -f "/opt/steamcmd/steamcmd.sh" ]; then
  140. echo "SteamCMD未安装,开始下载和安装..."
  141. echo "下载SteamCMD..."
  142. unset http_proxy
  143. unset https_proxy
  144. wget -O /opt/steamcmd/steamcmd_linux.tar.gz ${STEAMCMD_URL}
  145. echo "解压SteamCMD..."
  146. tar xvzf /opt/steamcmd/steamcmd_linux.tar.gz -C /opt/steamcmd
  147. echo "清理临时文件..."
  148. rm /opt/steamcmd/steamcmd_linux.tar.gz
  149. echo "设置执行权限..."
  150. chmod +x /opt/steamcmd/steamcmd.sh
  151. echo "SteamCMD安装完成!"
  152. else
  153. echo "SteamCMD已存在,跳过安装"
  154. fi
  155. # 设置crontab自动更新任务
  156. setup_crontab
  157. if [ ! -f "/root/Steam/steamapps/common/DayZServer/DayZServer" ]; then
  158. echo "DayZServer未安装,开始安装..."
  159. bash /opt/install_dayz.sh
  160. else
  161. echo "DayZServer已安装,检查更新"
  162. # 切换到SteamCMD目录
  163. cd /opt/steamcmd
  164. ./steamcmd.sh +login $STEAM_USERNAME $STEAM_PASSWORD +app_update 223350 validate +quit
  165. echo "启动DayZServer..."
  166. cd /root/Steam/steamapps/common/DayZServer
  167. start_dayzserver
  168. fi