123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- #!/bin/bash
- set -e # 遇到错误时退出
- echo "=========================================="
- echo "SteamCMD容器启动中..."
- echo "时间: $(date)"
- echo "=========================================="
- 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是否有更新.
- bash /opt/updatemod.sh update_server
- updatemodpath="/root/Steam/steamapps/workshop/content/221100"
- target_dir="/root/Steam/steamapps/common/DayZServer/client_mod"
- # 1. 删除target_dir目录下的所有软链接
- echo "清理现有的软链接..."
- if [ -d "$target_dir" ]; then
- find "$target_dir" -type l -delete
- echo "已删除 $target_dir 目录下的所有软链接"
- else
- mkdir -p "$target_dir"
- echo "创建目录: $target_dir"
- fi
- # 2. 根据MOD_IDS列表创建软链接
- if [ -n "$MOD_IDS" ]; then
- echo "开始根据MOD_IDS创建软链接..."
- IFS=',' read -ra MOD_ARRAY <<< "$MOD_IDS"
-
- for mod_id in "${MOD_ARRAY[@]}"; do
- echo "处理Mod ID: $mod_id"
-
- # 查找对应的mod目录
- mod_dir=$(find "$updatemodpath" -mindepth 1 -maxdepth 1 -type d -name "$mod_id" -print -quit)
-
- if [[ -n "$mod_dir" ]]; then
- echo "找到Mod目录: $mod_dir"
-
- # 查找meta.cpp文件获取mod名称
- 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}"
- echo "为 [$mod_name] (ID: $mod_id) 创建软链接: $symlink_path → $mod_dir"
- ln -s "$mod_dir" "$symlink_path"
- else
- echo "警告: 在 $meta_file 中未找到 name 字段,使用ID作为名称"
- symlink_path="${target_dir}/@${mod_id}"
- echo "为 [ID: $mod_id] 创建软链接: $symlink_path → $mod_dir"
- ln -s "$mod_dir" "$symlink_path"
- fi
- else
- echo "警告: 在 $mod_dir 中未找到 meta.cpp 文件,使用ID作为名称"
- symlink_path="${target_dir}/@${mod_id}"
- echo "为 [ID: $mod_id] 创建软链接: $symlink_path → $mod_dir"
- ln -s "$mod_dir" "$symlink_path"
- fi
- else
- echo "警告: 未找到ID为 $mod_id 的Mod目录"
- fi
- done
-
- echo "软链接创建完成!"
- else
- echo "未配置MOD_IDS,跳过软链接创建"
- fi
- # 初始化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" -xtype 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" -xtype 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
- 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
|