Files
Linux_Docker_build_DayzServer/DockerFile/start.sh
2025-07-24 23:26:53 +08:00

202 lines
6.8 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 "=========================================="
# 启动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=""
# 处理客户端mod使用 -xtype d
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}$(basename "$folder")" # 只保留目录名
done < <(find "./client_mod" -xtype d -name '@*' -print0)
# 处理服务端mod
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}$(basename "$folder")"
done < <(find "./server_mod" -xtype d -name '@*' -print0)
echo "客户端MODS: $client_mods"
echo "服务端MODS: $server_mods"
# 崩溃检测和自动重启循环
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