logo NodeSeekbeta

甲骨文升级脚本分享,手动先创建一个1核6G的,然后运行脚本升级,AI写的

还有前置OCI环境要安装的,问AI吧 xhj007 XXXXXXXXXXX的部分替换成自己的,报错直接问AI解决问题杠杠的

#!/bin/bash

#==============================================================
# OCI ARM 实例抢机/升级脚本 (优化版)
#==============================================================

# ============ 基本配置 ============
INSTANCE_OCID="XXXXXXXXXXX"

# 目标配置 - 只抢 4C24G
TARGET_CONFIGS=(
    "4:24"    # 4 OCPU / 24GB
)

RETRY_INTERVAL=3          # 重试间隔(秒) - 从10秒缩短到3秒
MAX_RETRY_INTERVAL=5      # 最大重试间隔
JITTER=1                  # 随机抖动(秒),避免和其他人同步碰撞

# ============ 邮件通知配置 ============
SMTP_HOST="smtp.gmail.com"
SMTP_PORT="465"
SMTP_USER="[email protected]"
SMTP_PASS="XXXXXXXXXXX"
EMAIL_TO="[email protected]"

# ============ Telegram 通知 ============
TG_BOT_TOKEN="XXXXXXXXXXX"
TG_CHAT_ID="XXXXXXXXXXX"

# ============ 日志配置 ============
LOG_FILE="$HOME/upgrade.log"
attempt=0
start_time=$(date +%s)

#==============================================================
# 通知函数
#==============================================================
send_email() {
    local subject="$1"
    local body="$2"
    echo -e "From: ${SMTP_USER}\nTo: ${EMAIL_TO}\nSubject: ${subject}\n\n${body}" | \
    curl -s --url "smtps://${SMTP_HOST}:${SMTP_PORT}" \
        --ssl-reqd \
        --mail-from "${SMTP_USER}" \
        --mail-rcpt "${EMAIL_TO}" \
        --upload-file - \
        --user "${SMTP_USER}:${SMTP_PASS}" \
        --login-options AUTH=LOGIN \
        --max-time 10 2>/dev/null
}

send_telegram() {
    if [[ -n "$TG_BOT_TOKEN" && -n "$TG_CHAT_ID" ]]; then
        curl -s --max-time 10 \
            "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
            -d "chat_id=${TG_CHAT_ID}" \
            -d "text=$1" \
            -d "parse_mode=HTML" 2>/dev/null
    fi
}

notify_success() {
    local ocpus="$1"
    local memory="$2"
    local msg="✅ OCI 实例升级成功!\n配置: ${ocpus} OCPU / ${memory} GB\n共尝试 ${attempt} 次\n时间: $(date '+%Y-%m-%d %H:%M:%S')"
    send_email "OCI 抢机成功! ${ocpus}C${memory}G" "$msg"
    send_telegram "$(echo -e "$msg")"
    echo -e "$msg"
}

log() {
    echo "$1" | tee -a "$LOG_FILE"
}

#==============================================================
# 主循环
#==============================================================
log "========================================"
log "[$(date '+%Y-%m-%d %H:%M:%S')] 脚本启动"
log "目标配置: ${TARGET_CONFIGS[*]}"
log "重试间隔: ${RETRY_INTERVAL}s (抖动 ±${JITTER}s)"
log "========================================"

# 启动时发送测试通知
send_telegram "🚀 OCI 抢机脚本已启动
目标配置: ${TARGET_CONFIGS[*]}
重试间隔: ${RETRY_INTERVAL}s"
log "已发送 Telegram 启动通知"

while true; do
    ((attempt++))

    # 轮流尝试不同配置方案
    config_index=$(( (attempt - 1) % ${#TARGET_CONFIGS[@]} ))
    IFS=':' read -r TARGET_OCPUS TARGET_MEMORY <<< "${TARGET_CONFIGS[$config_index]}"

    # 每10次显示一次运行状态摘要 + 发TG通知
    if (( attempt % 10 == 1 )); then
        elapsed=$(( $(date +%s) - start_time ))
        hours=$(( elapsed / 3600 ))
        mins=$(( (elapsed % 3600) / 60 ))
        log "[$(date '+%Y-%m-%d %H:%M:%S')] 第 $attempt 次尝试 | ${TARGET_OCPUS}C/${TARGET_MEMORY}G | 已运行 ${hours}h${mins}m"
        if (( attempt > 1 )); then
            send_telegram "❌ #${attempt} 仍在尝试中 | ${TARGET_OCPUS}C/${TARGET_MEMORY}G | 已运行 ${hours}h${mins}m"
        fi
    fi

    # 执行升级请求
    result=$(oci compute instance update \
        --instance-id "$INSTANCE_OCID" \
        --shape-config "{\"ocpus\": $TARGET_OCPUS, \"memory-in-gbs\": $TARGET_MEMORY}" \
        --force \
        --output json 2>&1)

    exit_code=$?

    if [[ $exit_code -eq 0 ]]; then
        log "============================================"
        log "🎉 [$(date '+%Y-%m-%d %H:%M:%S')] 升级成功!"
        log "配置: ${TARGET_OCPUS} OCPU / ${TARGET_MEMORY} GB"
        log "总尝试次数: ${attempt}"
        log "============================================"
        notify_success "$TARGET_OCPUS" "$TARGET_MEMORY"
        break
    else
        # 提取错误信息(取message字段或前3行)
        error_msg=$(echo "$result" | grep -oP '"message"\s*:\s*"\K[^"]+' | head -1)
        if [[ -z "$error_msg" ]]; then
            error_msg=$(echo "$result" | head -3)
        fi
        log "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ #${attempt} ${TARGET_OCPUS}C/${TARGET_MEMORY}G 失败: ${error_msg}"

        if echo "$result" | grep -qi "too many requests\|rate limit"; then
            log "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 触发限流,等待30秒..."
            sleep 30
            continue
        fi

        # 随机抖动的重试间隔
        jitter_val=$(( RANDOM % (JITTER * 2 + 1) - JITTER ))
        sleep_time=$(( RETRY_INTERVAL + jitter_val ))
        [[ $sleep_time -lt 1 ]] && sleep_time=1
        sleep "$sleep_time"
    fi
done

image

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有72720位seeker

🎉欢迎新用户🎉