如何实现Cron任务执行时间每日自动延后1分钟?含跨小时处理
解决方案:动态调整Cron执行时间或递增延迟时长
一、动态调整Cron执行时间方案
核心逻辑是每次签到脚本执行完成后,自动读取当前Cron任务的执行时间,计算延后1分钟的新时间(处理分钟满59后的小时进位),再更新Cron任务。
实现示例
- 编写Cron更新脚本
/root/update_cron.sh:
#!/bin/bash # 标记目标Cron任务的唯一标识 CRON_TASK="/root/clicker.sh" # 获取当前Cron中该任务的配置 current_cron=$(crontab -l | grep "$CRON_TASK") if [ -z "$current_cron" ]; then echo "未找到目标Cron任务" exit 1 fi # 解析当前的分钟和小时参数 current_min=$(echo "$current_cron" | awk '{print $1}') current_hour=$(echo "$current_cron" | awk '{print $2}') # 计算下一次执行的分钟和小时 next_min=$((current_min + 1)) next_hour=$current_hour # 处理分钟进位:59+1=0,小时加1 if [ $next_min -ge 60 ]; then next_min=0 next_hour=$((current_hour + 1)) # 处理小时进位:23+1=0 if [ $next_hour -ge 24 ]; then next_hour=0 fi fi # 构建新的Cron配置 new_cron="$next_min $next_hour * * * $CRON_TASK" # 更新Cron任务:先删除旧配置,再添加新配置 crontab -l | grep -v "$CRON_TASK" | crontab - echo "$new_cron" | crontab - # 可选:添加日志记录 echo "$(date '+%Y-%m-%d %H:%M:%S'): Cron已更新为 $new_cron" >> /root/cron_update.log
- 在你的签到脚本
/root/clicker.sh末尾添加调用:
# 你的原有签到逻辑(登录、点击签到按钮) # ... # 执行Cron更新 /root/update_cron.sh
- 初始化Cron任务
手动添加初始执行时间,比如:
crontab -e # 添加一行:33 23 * * * /root/clicker.sh
- 给脚本添加执行权限
chmod +x /root/clicker.sh /root/update_cron.sh
二、递增Sleep时长方案
固定Cron的执行时间(比如每天00:00),每次执行脚本时,根据历史执行次数递增Sleep时长,确保每次签到操作间隔至少24小时。
实现示例
- 创建执行次数记录文件:
echo 0 > /root/run_count.txt
- 修改签到脚本
/root/clicker.sh:
#!/bin/bash # 读取当前执行次数 run_count=$(cat /root/run_count.txt) # 计算延迟时长:首次执行无延迟,之后每次递增60秒 sleep_sec=$((run_count * 60)) echo "等待 $sleep_sec 秒后执行签到..." sleep $sleep_sec # 你的原有签到逻辑(登录、点击签到按钮) # ... # 仅在签到成功时递增执行次数(可根据实际情况调整判断条件) if [ $? -eq 0 ]; then new_count=$((run_count + 1)) echo $new_count > /root/run_count.txt fi
- 设置固定Cron任务:
crontab -e # 添加一行:0 0 * * * /root/clicker.sh
内容的提问来源于stack exchange,提问作者Max Zavodniuk
相关产品推荐
相关产品推荐

