甲骨文的账号越难越申请,升级为付费账号的成功几率也越来越低,再想开出 4C+24G 这样的 ARM 实例已经几乎不可能 (东京、首尔、圣何塞是重灾区),本文教大家利用甲骨文官方的 Oracle Cloud Infrastructure (OCI) 工具定时检测是否有闲置实例,如果有就自动创建,直到创建成功。

使用 OCI 自动刷 Oracle 实例脚本

邮件提醒

创建名为sendmail.py的文件,添加以下内容:

import smtplib
from email.mime.text import MIMEText
import sys

# === 配置区 ===
SMTP_SERVER = "SMTP 服务器地址"    
SMTP_PORT = 端口
SENDER_EMAIL = "发件人邮箱"
AUTH_CODE = "发件人密码"
RECEIVER_EMAIL = "收件人邮箱"

def send_mail(subject, content):
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['Subject'] = subject
    msg['From'] = SENDER_EMAIL
    msg['To'] = RECEIVER_EMAIL
    
    try:
        server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
        server.login(SENDER_EMAIL, AUTH_CODE)
        server.sendmail(SENDER_EMAIL, [RECEIVER_EMAIL], msg.as_string())
        server.quit()
        print("邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败:{e}")

if __name__ == "__main__":
    if len(sys.argv) > 2:
        send_mail(sys.argv[1], sys.argv[2])

检测 ARM 实例并创建

检测脚本

创建名为reaper.sh的文件,添加以下内容:

#!/bin/bash

# ======================= Oracle 参数配置区 =======================
COMPARTMENT_ID="COMPARTMENT_ID"
AD_NAME="AD_NAME"
SUBNET_ID="SUBNET_ID"
IMAGE_ID="IMAGE_ID"
SSH_KEY_FILE="SSH_KEY_FILE"
# =================================================================

python3 sendmail.py "OCI 脚本提醒" "ARM创建脚本已重启。"

echo "------------------------------------------------"
echo "创建任务开始"
echo "------------------------------------------------"

while true; do
  # 执行创建命令
  RESPONSE=$(oci compute instance launch \
    --availability-domain "$AD_NAME" \
    --compartment-id "$COMPARTMENT_ID" \
    --shape "VM.Standard.A1.Flex" \
    --shape-config '{"ocpus": 4, "memoryInGB": 24}' \
    --assign-public-ip true \
    --image-id "$IMAGE_ID" \
    --subnet-id "$SUBNET_ID" \
    --ssh-authorized-keys-file "$SSH_KEY_FILE" 2>&1)

  # 1. 成功捕获到实例 OCID
  if [[ $RESPONSE == *"ocid1.instance"* ]]; then
    echo "$(date): [SUCCESS] 实例创建成功!"
    python3 sendmail.py "【成功】Oracle ARM 已开通" "恭喜!4核24G 实例已成功创建。详情如下:\n\n$RESPONSE"
    break

  # 2. 无库存 (500 或 Out of host capacity)
  elif [[ $RESPONSE == *"Out of host capacity"* ]] || [[ $RESPONSE == *"InternalError"* ]]; then
    echo "$(date): 暂无库存,持续监控中..."

  # 3. 重点:处理 429 Too Many Requests
  elif [[ $RESPONSE == *"Too many requests"* ]] || [[ $RESPONSE == *"429"* ]]; then
    echo "$(date): [WARN] 触发频率限制(429)。暂停15分钟..."
    # 频率限制时发送警告信
    python3 sendmail.py "【警告】触发 429 频率限制" "检测到频率超限,脚本将暂停15分钟以保护账号安全。"
    sleep 900

  # 4. 其他致命错误
  else
    echo "$(date): [ERROR] 遇到异常:$RESPONSE"
    python3 sendmail.py "【停止】脚本异常" "脚本遇到非预期错误已停止运行:\n\n$RESPONSE"
    exit 1
  fi

  # 随机创建时间间隔为 240 到 360 秒(4-6 分钟)
  SLEEP_TIME=$(( ( RANDOM % 120 )  + 240 ))
  echo "下一轮尝试将在 $SLEEP_TIME 秒后进行..."
  sleep $SLEEP_TIME
done

脚本参数

脚本中顶部的五个参数必须设置,如果不完整设置,无法创建成功。

COMPARTMENT_ID Oracle Cloud 后台 - 用户设置 - 区间 - 租户 - 详细信息。显示的 OCID 就是值,前缀是ocid1.tenancy

AD_NAME 在你账号权限范围内可申请的区域名称,比如首尔是saBi:AP-SEOUL-1-AD-1

SUBNET_ID Oracle Cloud 后台 - 网络 - 虚拟云网络 - 子网 - 公共子网 - 详细信息。显示的 OCID 就是值,前缀是ocid1.subnet

IMAGE_ID 点击此处找到对应的区域和系统映像的值,ARM 必须用aarch64的映像。

SSH_KEY_FILE SSH KEY 文件。

备注:

1、将sendmail.py reaper.sh ssh-authorized-keys-file 放置在相同的目录,方便管理。

2、此脚本运行的前提是已经安装并配置好 OCI CLI,点击此处查看对应系统的安装命令。

3、为避免 429 错误,我将间隔时间设定到了 4-6 分钟,如果是已升级的付费号,可以将间隔时间缩短。

4、使用nohup ./reaper.sh > oci_log.txt 2>&1 &让脚本在后台自动运行,使用tail -f oci_log.txt查看日志。

5、使用ps -ef | grep reaper.sh检查进程,使用pkill -f reaper.sh关闭进程。

6、可以在脚本中自定义 CPU 核心数和内存大小(1C+6G 2C+12G 3C+18G 4C+24G),支持 AMD 实例,需自己修改。