Files
Linux_Docker_build_DayzServer/DockerFile/start.sh

245 lines
8.6 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自动更新任务..."
# 保存环境变量到/etc/environment文件解决cron任务无法读取环境变量的问题
echo "保存环境变量到/etc/environment..."
cat > /etc/environment << EOF
STEAM_USERNAME=${STEAM_USERNAME}
STEAM_PASSWORD=${STEAM_PASSWORD}
MOD_IDS=${MOD_IDS}
DAYZ_MISSIONS=${DAYZ_MISSIONS}
DAYZ_SERVER_PORT=${DAYZ_SERVER_PORT}
DAYZ_CPU_COUNT=${DAYZ_CPU_COUNT}
ENABLE_AUTO_UPDATE=${ENABLE_AUTO_UPDATE}
UPDATE_INTERVAL=${UPDATE_INTERVAL}
EOF
# 启动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是否有更新.
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
# 设置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