Files
Linux_Docker_build_DayzServer/DockerFile/start.sh

161 lines
5.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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是否有更新.
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
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