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

2023-05-16

需求场景

开发后台的同学,经常需要写一些脚本定时启动运行,通常使用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. 复制代码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 超时错误 - 通过 SQL Mail 发送邮件 - Service Broker 队列

    这是我的第一个问题 所以我希望我提供足够的信息 我们尝试利用 SQL Mail Service Broker 发送大约 1000 封电子邮件 我们对此还比较陌生 但遇到了这个问题 一些背景 我们创建了一个 Profile 一个 Accoun
  • NodeJS + Mongoose 连接超时

    所以我读过猫鼬司机 http mongoosejs com NodeJS 会缓存查询 直到连接到 MongoDB 无超时 但是当数据库崩溃时 应该可以向用户发送消息 那么让我们看一下这个 NodeJS 代码 Users find funct
  • C# Xamarin Forms - 执行任务,超时

    和其他许多人一样 我需要编写一个返回任务的函数 并且我希望该任务在一段时间后自动超时 初始代码如下所示 class MyClass TaskCompletionSource
  • 能否以编程方式更改 ASP.NET 中的会话超时?

    可以吗 还是只能在IIS上配置 您通常编辑 Global asax 文件的 Session Start 方法并设置会话超时 http msdn microsoft com en us library system web sessionst
  • Monotouch/WCF:为什么无法覆盖wcf绑定超时设置

    Monotouch WCF 为什么无法覆盖 wcf 绑定默认超时设置 public class MyServiceClient ClientBase
  • 使用 urllib2 或任何其他 http 库读取超时

    我有用于读取这样的网址的代码 from urllib2 import Request urlopen req Request url for key val in headers items req add header key val r
  • TCP Socket无连接超时

    我打开一个 TCP 套接字并将其连接到网络上其他位置的另一个套接字 然后我就可以成功发送和接收数据 我有一个计时器 每秒向套接字发送一些内容 然后 我通过强行断开连接 在本例中拔出以太网电缆 来粗暴地中断连接 我的套接字仍然报告它每秒都在成
  • Google Guava Cache - 在运行时更改驱逐超时值

    我正在使用以下内容 LoadingCache
  • linux 使用超时(以毫秒为单位)杀死进程

    我想在Linux上指定时间过后强制终止程序 我发现linux中的 timeout util可以在指定时间后杀死程序 但它不接受毫秒 也就是说 timeout TIME PROGRAM 会在 TIME 过去后杀死 PROGRAM 其中 TIM
  • Java:URLConnection合理的超时时间

    默认情况下 URLConnection 的超时时间为 0 无限制 XXXXX 的合理值是多少 URL url URLConnection uCon url openConnection uCon setConnectTimeout XXXX
  • 如何使用 File#flock 发出非阻塞独占锁请求?

    如何申请非阻塞锁 为什么 Ruby 没有文件 flock http www ruby doc org core 2 0 File html method i flock当单独尝试锁定文件时是否按预期工作 将文件锁定在块中并不是此问题的正确解
  • PhantomJs超时

    我使用 Jasmine 和 PhantomJS 来运行测试用例 在我的典型测试用例中 我拨打服务电话 等待响应并确认响应 有些请求可能会在几秒钟内返回 有些请求可能需要一分钟才能返回 当通过 PhantomJS 运行时 测试用例因服务调用而
  • ruby 2.1.2超时仍然不是线程安全的吗?

    我有 50 个 sidekiq 线程在网络上爬行 几周前 这些线程在运行大约 20 分钟后开始挂起 当我执行回溯转储时 大多数线程都卡在 net http 初始化上 app vendor ruby 2 1 2 lib ruby 2 1 0
  • 调用需要很长时间执行的.php时如何解决“mod_fastcgi.c.2566意外的文件结束(可能是fastcgi进程死亡)”?

    在我的 php 应用程序中 我恢复 db2 数据库 它工作正常 但这里有一个巨大的 2 9GB 最后是500 Internal Server Error 我使用 exec 从 php cp db2 等运行 unix shell 命令 从 f
  • Powershell/PowerCLI 循环、超时和退出

    以下是场景 我通过 Powershell PowerCLI VMwares Powershell 模块 远程启动虚拟机 一旦虚拟机启动 我将针对虚拟机运行一系列 cmdlet 目前我有这段代码 Start VM my VM Name run
  • java中的简单超时

    谁能指导我如何在java中使用简单的超时 基本上在我的项目中我正在执行一条语句br readLine 它正在读取调制解调器的响应 但有时调制解调器没有响应 为此 我想添加一个超时 我正在寻找类似的代码 try String s br rea
  • 由于超时,应用程序无法在模拟器上启动

    从过去 1 小时开始 我无法启动我的应用程序Eclipse Helios和我的控制台Eclipse给出以下错误 2011 11 21 10 37 00 PagingScrollerExample Failed to install Pagi
  • 如何防止 Internet Explorer 连接超时?

    如果网站处理和加载页面的时间超过 10 秒 Internet Explorer将做一个connection timeout 用户可以通过将注册表中的默认值设置为更高的值来防止这种情况发生 但我真的不能告诉我的任何客户这样做 所以我如何首先防
  • 如何在 bash 中结合超时和 eval 命令

    为了执行存储在变量中的命令eval使用命令 gt a echo e a nb wc l gt eval a 2 但如何才能与它结合起来呢 timeout命令 我尝试过以下操作 这给了我错误的输出 gt timeout 10 a a b wc
  • 设置Paramiko模块的sftp.get()时间限制

    我正在使用 Paramiko 的 SFTP 客户端将文件从远程服务器下载到客户端 即获取操作 要传输的文件有点大 1GB 所以我希望如果时间超过10秒 get操作就会超时 但是设置连接的超时值不起作用 它似乎只是创建 SSH 连接的超时 而

随机推荐