crontab、flock、timeout的配合使用实现定时任务超时及报警

需求场景

开发后台的同学,经常需要写一些脚本定时启动运行,通常使用crontab来实现。有时候还有更加苛刻的需求:脚本不仅需要定时启动,而且还需要保证互斥 (同一时间只有一个进程在跑,上次的没结束则这次不启动)的要求,甚至还需要设置超时时间(当运行时间过长自动结束进程)和超时报警。那又该如何实现呢?答案是:crontab定时启动任务,flock保证互斥,timeout设置超时以及报警脚本

crontab、flock、timeout的使用介绍

crontab的使用

crontab是Linux自带的实现定时任务程序,只能实现分钟级的定时任务。具体参考crontab 定时任务

需要注意的点:

  • 实现每8分钟启动一次任务的实际执行情况是,从整点的0分钟开始每隔8分钟执行一次,所以56分钟时会执行一次且下次0分钟又会执行,其他小时、日应该也是类似。
  • 脚本的路径应该使用绝对路径或者使用cd命令到绝对路径

flock的使用

flock可以保证只有一个脚本单例执行。主要用的是互斥非阻塞模式,设置等待时间也有一定的用处,但我用的较少。

参考使用flock命令确保脚本单例执行

需要注意的点:

  • flock的互斥文件最好使用绝对路径且以.lock结尾
  • 使用flock之后会生成相应的文件,后面命令完成结束之后并不会自动清除掉

timeout的使用

参考timeout(1)-Linux man page

使用例子


  
  
  1. # 超时发送-9信号,超时执行后面的脚本输出failed
  2. timeout -s 9 5 sleep 20 || echo 'failed'
  3. # 未超时执行后面的脚本输出success
  4. timeout -s 9 10 sleep 5 && echo 'success'
  5. 复制代码

需要注意的点

  • timeout 正常结束的返回码是0
  • timeout 超时kill结束的返回码是124

配合使用例子

首先定时执行的脚本task.sh如下:


  
  
  1. echo 'start at:' `date`
  2. # 大概3分钟
  3. sleep 180
  4. echo 'end at:' `date`
  5. 复制代码

其次是超时报警通知脚本alarm.sh如下:


  
  
  1. # 追加输出超时时间到alarm.log
  2. echo 'timeout at:' `date` >>alarm.log
  3. # 其他的报警措施,发邮件、短信....
  4. 复制代码

由于上面的定时任务大概3分钟结束,所以我们的超时时间大于3分钟就行了(具体多少根据不同情况设置就行了),假设6分钟执行一次且互斥非阻塞,超时10分钟且超时执行报警脚本,则最终crontab文件如下


  
  
  1. */6 * * * * cd /data/projec && flock -xn ./task.lock -c 'timeout -9 600 sh task.sh || sh alarm.sh'
  2. 复制代码

需要注意的点

如果task.sh启动了子进程进行处理,则需要在task.sh的末尾加上wait命令等待全部子进程完成才结束,否则timeout无效


  
  
  1. cd /data/project
  2. nohub python3 main.py >main.log 2>&1 &
  3. wait
  4. 复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值