start.sh 8.5 KB

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