#!/bin/bash set -e # 遇到错误时退出 echo "==========================================" echo "SteamCMD容器启动中..." echo "时间: $(date)" echo "==========================================" # 启动cron服务并设置crontab任务 setup_crontab() { # 检查是否启用自动更新 if [ "${ENABLE_AUTO_UPDATE:-true}" != "true" ]; then echo "自动更新已禁用 (ENABLE_AUTO_UPDATE=false)" return fi echo "设置crontab自动更新任务..." # 启动cron服务 service cron start # 创建日志目录 mkdir -p /var/log touch /var/log/updatemod.log chmod 666 /var/log/updatemod.log # 获取更新间隔(默认15分钟) local interval="${UPDATE_INTERVAL:-15}" # 设置crontab任务 echo "*/$interval * * * * /opt/updatemod.sh >> /var/log/updatemod.log 2>&1" | crontab - # 验证crontab任务 echo "当前crontab任务列表:" crontab -l echo "crontab自动更新任务设置完成!" echo "任务将每${interval}分钟自动运行一次 /opt/updatemod.sh" echo "日志文件位置: /var/log/updatemod.log" } copy_files() { local mod_path=$1 local parent_path=$2 local lower_addons_path="${mod_path}/addons" local upper_addons_path="${mod_path}/Addons" local lower_keys_path="${mod_path}/keys" local upper_keys_path="${mod_path}/Keys" # 处理addons目录 if [ -d "$lower_addons_path" ]; then find "$lower_addons_path" -type f -name '*.bisign' -exec cp -dpf {} "$parent_path/addons/" \; elif [ -d "$upper_addons_path" ]; then find "$upper_addons_path" -type f -name '*.bisign' -exec cp -dpf {} "$parent_path/addons/" \; fi # 处理keys目录 if [ -d "$lower_keys_path" ]; then find "$lower_keys_path" -type f -name '*.bikey' -exec cp -dpf {} "$parent_path/keys/" \; elif [ -d "$upper_keys_path" ]; then find "$upper_keys_path" -type f -name '*.bikey' -exec cp -dpf {} "$parent_path/keys/" \; fi } start_dayzserver() { cd /root/Steam/steamapps/common/DayZServer # 启动服务器之前,检查mod是否有更新. updatemodpath="/root/Steam/steamapps/workshop/content/221100" target_dir="/root/Steam/steamapps/common/DayZServer/client_mod" find "$updatemodpath" -mindepth 1 -maxdepth 1 -type d -print0 | while IFS= read -r -d $'\0' mod_dir; do meta_file=$(find "$mod_dir" -type f -name "meta.cpp" -print -quit) if [[ -f "$meta_file" ]]; then mod_name=$(grep -oP 'name\s*=\s*"\K[^"]*' "$meta_file") if [[ -n "$mod_name" ]]; then symlink_path="${target_dir}/@${mod_name}" if [[ ! -L "$symlink_path" ]]; then echo "为 [$mod_name] 创建软链接: $symlink_path → $mod_dir" ln -s "$mod_dir" "$symlink_path" else echo "软链接已存在: $symlink_path, 跳过创建" fi else echo "警告: 在 $meta_file 中未找到 name 字段" fi else echo "警告: 在 $mod_dir 中未找到 meta.cpp 文件" fi done # 初始化mod变量 client_mods="" server_mods="" while IFS= read -r -d $'\0' folder; do echo "处理客户端mod: $folder" copy_files "$folder" "." if [ -n "$client_mods" ]; then client_mods="${client_mods};" fi client_mods="${client_mods}${folder}" done < <(find "./client_mod" -type d -name '@*' -print0) while IFS= read -r -d $'\0' folder; do echo "处理服务端mod: $folder" copy_files "$folder" "." if [ -n "$server_mods" ]; then server_mods="${server_mods};" fi server_mods="${server_mods}${folder}" done < <(find "./server_mod" -type d -name '@*' -print0) # 崩溃检测和自动重启循环 while true; do echo "==========================================" echo "启动DayZServer..." echo "时间: $(date)" echo "端口: ${DAYZ_SERVER_PORT}" echo "CPU核心数: ${DAYZ_CPU_COUNT}" echo "客户端mod: ${client_mods}" echo "服务端mod: ${server_mods}" echo "==========================================" 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}" # 启动DayZServer并捕获退出状态 ./DayZServer -port=${DAYZ_SERVER_PORT} -cpuCount=${DAYZ_CPU_COUNT} \ "-config=serverDZ.cfg" "-profiles=profiles" \ "-mission=./mpmissions/${DAYZ_MISSIONS}" \ "-mod=${client_mods}" "-servermod=${server_mods}" & # 保存进程ID DAYZ_PID=$! echo "DayZServer进程ID: $DAYZ_PID" # 等待进程结束 wait $DAYZ_PID EXIT_CODE=$? echo "==========================================" echo "DayZServer已退出" echo "退出代码: $EXIT_CODE" echo "时间: $(date)" echo "==========================================" # 检查是否正常退出(退出代码0通常表示正常退出) if [ $EXIT_CODE -eq 0 ]; then echo "DayZServer正常退出,将在5秒后重启..." sleep 5 echo "重新启动DayZServer..." else echo "DayZServer异常退出,将在5秒后重启..." sleep 5 echo "重新启动DayZServer..." fi done } # 检查并安装SteamCMD if [ ! -f "/opt/steamcmd/steamcmd.sh" ]; then echo "SteamCMD未安装,开始下载和安装..." echo "下载SteamCMD..." unset http_proxy unset https_proxy wget -O /opt/steamcmd/steamcmd_linux.tar.gz ${STEAMCMD_URL} echo "解压SteamCMD..." tar xvzf /opt/steamcmd/steamcmd_linux.tar.gz -C /opt/steamcmd echo "清理临时文件..." rm /opt/steamcmd/steamcmd_linux.tar.gz echo "设置执行权限..." chmod +x /opt/steamcmd/steamcmd.sh echo "SteamCMD安装完成!" else echo "SteamCMD已存在,跳过安装" fi # 设置crontab自动更新任务 setup_crontab if [ ! -f "/root/Steam/steamapps/common/DayZServer/DayZServer" ]; then echo "DayZServer未安装,开始安装..." bash /opt/install_dayz.sh else echo "DayZServer已安装,检查更新" # 切换到SteamCMD目录 cd /opt/steamcmd ./steamcmd.sh +login $STEAM_USERNAME $STEAM_PASSWORD +app_update 223350 validate +quit echo "启动DayZServer..." cd /root/Steam/steamapps/common/DayZServer start_dayzserver fi