如何编写定时重复执行的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定时任务工具是最佳选择:
- 编辑当前用户的cron任务:
crontab -e - 在文件末尾添加一行规则(替换成你的脚本路径和间隔时间):
规则解释:*/5 * * * * /home/your_user/path/to/your_script.sh*/5表示每隔5分钟,后面的四个*分别代表小时、日期、月份、星期(全为*表示任意时间) - 保存退出后,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




