#!/bin/sh # 加载公共函数库 . /app/common.sh # 设置定时任务 setup_cron() { # 获取当前时间的上一分钟作为执行时间 # 格式: 分 时 * * * current_min=$(date +%M) current_hour=$(date +%H) # 计算上一分钟对应的分钟和小时 if [ "$current_min" -eq 0 ]; then cron_min=59 if [ "$current_hour" -eq 0 ]; then cron_hour=23 else cron_hour=$((current_hour - 1)) fi else cron_min=$((current_min - 1)) cron_hour=$current_hour fi # 去掉前导零(避免被解释为八进制) cron_min=$(echo $cron_min | sed 's/^0//') cron_hour=$(echo $cron_hour | sed 's/^0//') # 如果为空则设为0 [ -z "$cron_min" ] && cron_min=0 [ -z "$cron_hour" ] && cron_hour=0 cron_entry="$cron_min $cron_hour * * * sh $UPDATE_SCRIPT >> /app/update.log 2>&1" echo "设置定时任务: 每天 ${cron_hour}:${cron_min} 执行更新检测" # 检测 cron 类型并配置 if command -v crontab >/dev/null 2>&1; then # Debian/Ubuntu 风格的 cron echo "$cron_entry" | crontab - # 启动 cron 服务 if command -v cron >/dev/null 2>&1; then cron echo "cron 服务已启动" elif command -v crond >/dev/null 2>&1; then crond echo "crond 服务已启动" fi else # Busybox 风格的 crond mkdir -p /var/spool/cron/crontabs # 删除旧的更新任务(如果存在) if [ -f "$CRON_FILE" ]; then grep -v "$UPDATE_SCRIPT" "$CRON_FILE" > "${CRON_FILE}.tmp" 2>/dev/null || true mv "${CRON_FILE}.tmp" "$CRON_FILE" fi # 添加新的定时任务 echo "$cron_entry" >> "$CRON_FILE" # 启动 crond crond -b -l 8 echo "crond 已启动" fi } # 仅更新模式(构建时使用) if [ "${1}" = "OnlyUpdate" ]; then echo "构建模式:下载初始版本..." ftag_name=$(get_latest_version) if [ -z "$ftag_name" ]; then echo "无法获取最新版本号,使用默认版本 ${DEFAULT_VERSION}" ftag_name="$DEFAULT_VERSION" fi echo "版本: ${ftag_name}" if download_version "$ftag_name" "$MIXAPI_BIN"; then save_version "$ftag_name" echo "下载完成" else echo "下载失败" exit 1 fi exit 0 fi # 正常启动模式 echo "启动 mixapi 服务..." # 检查本地是否有可执行文件 if [ ! -f "$MIXAPI_BIN" ]; then echo "本地没有可执行文件,先下载..." ftag_name=$(get_latest_version) if [ -z "$ftag_name" ]; then ftag_name="$DEFAULT_VERSION" fi download_version "$ftag_name" "$MIXAPI_BIN" save_version "$ftag_name" fi # 设置定时任务 setup_cron # 启动时先执行一次更新检测(后台) echo "启动时执行一次更新检测..." sh "$UPDATE_SCRIPT" & # 启动 mixapi(前台运行,保持容器运行) echo "启动 mixapi..." exec "$MIXAPI_BIN"