You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编写定时重复执行的Bash脚本?API限流场景自动化咨询

Bash定时重复脚本实现方案

当然没问题!这两个需求都是Bash脚本开发里非常常见的场景,我来给你详细拆解可行的实现方案:

1. 编写每隔X分钟重复运行的Bash脚本

实现这个需求有两种主流方式,根据你的使用场景选择即可:

方式一:用while循环+sleep(临时运行首选)

这种方法简单直接,适合临时需要重复执行的任务,脚本会一直循环直到你手动终止:

#!/bin/bash
# 定义间隔时间(分钟),替换成你需要的数值
INTERVAL=5

while true; do
    # --------------------------
    # 这里写入你要重复执行的命令/逻辑
    echo "任务执行中,当前时间:$(date)"
    # 比如调用其他脚本:./your_task.sh
    # --------------------------

    # 等待指定分钟数
    sleep ${INTERVAL}m
done

使用说明

  • 给脚本添加执行权限:chmod +x repeat_script.sh
  • 运行脚本:./repeat_script.sh,按Ctrl+C可终止
  • 如果需要后台运行(关闭终端也不停止):nohup ./repeat_script.sh &,输出会保存在nohup.out文件中

方式二:用cron(长期定时任务首选)

如果需要脚本长期稳定地每隔X分钟运行,Linux系统自带的cron定时任务工具是最佳选择:

  1. 编辑当前用户的cron任务:crontab -e
  2. 在文件末尾添加一行规则(替换成你的脚本路径和间隔时间):
    */5 * * * * /home/your_user/path/to/your_script.sh
    
    规则解释:*/5表示每隔5分钟,后面的四个*分别代表小时、日期、月份、星期(全为*表示任意时间)
  3. 保存退出后,cron会自动加载新任务,无需重启服务

2. 针对API调用限制的24小时自动化脚本

针对你提到的「每15分钟调用一次API、持续运行24小时」的需求,我们可以在while循环的基础上增加运行时长限制,同时加入API调用的异常处理:

实现脚本示例

#!/bin/bash
# 配置参数
RUN_TOTAL_MINUTES=$((24 * 60))  # 总运行时长:24小时=1440分钟
API_INTERVAL=15                 # API调用间隔:15分钟
API_URL="https://your-api-endpoint.com"  # 替换成你的API地址

# 记录脚本启动时间(时间戳,单位秒)
start_timestamp=$(date +%s)

while true; do
    # --------------------------
    # 执行API调用并处理异常
    echo "[$(date)] 开始调用API..."
    # 用curl调用API,可根据需求添加Headers、请求体等参数
    response=$(curl -s -w "%{http_code}" "${API_URL}")
    http_code=${response: -3}
    response_body=${response%???}

    if [ "${http_code}" -eq 200 ]; then
        echo "API调用成功,响应内容:${response_body}"
        # 可添加数据存储逻辑,比如写入日志:
        # echo "$(date) | ${response_body}" >> api_data.log
    elif [ "${http_code}" -eq 429 ]; then
        echo "API调用触发限流(429),延长等待时间至30分钟"
        sleep 30m
        continue  # 跳过常规等待,直接进入下一次调用
    else
        echo "API调用失败,状态码:${http_code},响应:${response_body}"
    fi
    # --------------------------

    # 计算已运行时长(分钟)
    current_timestamp=$(date +%s)
    elapsed_minutes=$(( (current_timestamp - start_timestamp) / 60 ))

    # 判断是否已达到24小时运行时长
    if [ "${elapsed_minutes}" -ge "${RUN_TOTAL_MINUTES}" ]; then
        echo "[$(date)] 已运行满24小时,脚本自动退出"
        break
    fi

    # 等待15分钟后进行下一次调用
    sleep ${API_INTERVAL}m
done

关键细节说明

  • 加入了HTTP状态码判断,针对API限流(429)的情况做了特殊处理,避免频繁触发限流导致账号被封禁
  • 通过时间戳计算已运行时长,到点自动退出,无需手动干预
  • 同样可以用nohup ./api_script.sh &让脚本后台运行

补充注意事项

  • 确保脚本有足够的权限访问API(比如配置正确的密钥、证书)
  • 可添加更完善的日志功能,方便后续排查问题
  • 如果需要错误重试逻辑,可以引入until循环,直到API调用成功再进入下一个间隔周期

内容的提问来源于stack exchange,提问作者Parshwa Shah

火山引擎 最新活动