197 lines
6.6 KiB
Bash
197 lines
6.6 KiB
Bash
#!/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" -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 |