如何为cronjob失败任务添加4小时后自动重试逻辑
Cron任务失败后4小时重试Notebook实现方案
原生cron没有内置失败延迟重试的配置项,不用搜专门的cron参数,直接在执行层加逻辑就能实现,给你两个可直接用的方案:
方案1:基于at命令实现(推荐,可靠性高)
这个方案依赖系统自带的at一次性定时任务服务,不会占后台进程,机器重启任务也不丢。
- 先确认at服务可用,Debian/Ubuntu系执行
apt install at && systemctl enable --now atd,CentOS/RHEL系执行yum install at && systemctl enable --now atd即可。 - 直接修改crontab配置,替换成下面的内容:
PATH=/opt/tljh/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin SHELL=/bin/bash ## test 05 23 * * * papermill ~/a.ipynb ~/a_output.ipynb || echo "papermill ~/a.ipynb ~/a_output.ipynb" | at now + 4 hours 05 23 * * * papermill ~/b.ipynb ~/b_output.ipynb || echo "papermill ~/b.ipynb ~/b_output.ipynb" | at now + 4 hours
逻辑说明
- shell里
||是短路执行符,只有前面的papermill命令执行失败(退出码非0)时,才会运行后面的重试逻辑 - 重试逻辑是把需要重跑的命令传给
at服务,由at服务在4小时后一次性执行对应命令,不会重复触发 - 原有crontab里的PATH配置已经包含了papermill的安装路径,at执行时会继承这个PATH,不会出现找不到命令的问题
如果需要避免重试失败后无限循环提交任务,可以给每个任务加个重试次数标记,最多重试1次,改法如下:
05 23 * * * rm -f ~/.a_retry_mark && papermill ~/a.ipynb ~/a_output.ipynb || ( [ ! -f ~/.a_retry_mark ] && touch ~/.a_retry_mark && echo "papermill ~/a.ipynb ~/a_output.ipynb" | at now + 4 hours ) 05 23 * * * rm -f ~/.b_retry_mark && papermill ~/b.ipynb ~/b_output.ipynb || ( [ ! -f ~/.b_retry_mark ] && touch ~/.b_retry_mark && echo "papermill ~/b.ipynb ~/b_output.ipynb" | at now + 4 hours )
正常每日定点跑任务时会先清空旧的重试标记,第一次失败后打标记提交重试,重试时如果再失败,因为标记已经存在,不会再提交新的重试任务,不会出现任务无限堆积的问题。
方案2:shell包装脚本实现(无额外依赖)
不想装at服务的话可以写个简单的包装脚本,但是可靠性差一点,4小时等待期内如果机器重启,重试任务会直接丢失。
- 新建脚本
~/run_papermill.sh,写入以下内容:
#!/bin/bash NOTEBOOK_PATH=$1 OUTPUT_PATH=$2 # 执行原任务 papermill "$NOTEBOOK_PATH" "$OUTPUT_PATH" if [ $? -ne 0 ]; then # 失败后等4小时重试 sleep 14400 papermill "$NOTEBOOK_PATH" "$OUTPUT_PATH" fi
- 给脚本加执行权限:
chmod +x ~/run_papermill.sh - 修改crontab任务为调用脚本:
PATH=/opt/tljh/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin SHELL=/bin/bash ## test 05 23 * * * ~/run_papermill.sh ~/a.ipynb ~/a_output.ipynb 05 23 * * * ~/run_papermill.sh ~/b.ipynb ~/b_output.ipynb
这个方案的缺点是等待重试的4小时里脚本会一直占着一个系统进程,适合任务量小、机器不会随便重启的场景。
内容的提问来源于stack exchange,提问作者Xixi
相关产品推荐
相关产品推荐

