linux使用flock文件锁解决脚本周期内未执行完重复执行

关于flock

  • flock 是对于整个文件的建议性锁。也就是说,如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的。(建议性锁不强求进程遵守。)最棒的一点是,它的第一个参数是文件描述符,在此文件描述符关闭时,锁会自动释放。而当进程终止时,所有的文件描述符均会被关闭。

应用场景

linux的crontab命令,可以定时执行操作,最小周期是每分钟执行一次。现在有个问题,如果设定了任务每2分钟执行一次,但有可能执行该任务需要花费10分钟,这时系统会再执行任务。导致两个相同的任务在执行。这种情况下可能会出现一些并发问题,严重时会导致出现脏数据/性能瓶颈的恶性循环。
通过使用flock建立排它锁可以规避这个问题,如果一个进程对某个加了排他锁,则其它进程无法加锁,可以选择等待超时或马上返回。

  • 例如
    cat /opt/sleep.sh

#!/bin/bash
echo "----------------------------------"
echo "start at `date '+%Y-%m-%d %H:%M:%S'` ..."
sleep 300s
echo "finished at `date '+%Y-%m-%d %H:%M:%S'` ..."

  • 设置计划任务每2分钟执行

2/* * * * *  /opt/sleep.sh >> /tmp/sleep.log

而实际情况是10分钟后我们查看进程ps aux|grep sleep.sh 可以看到有5个进程在运行,我们则希望执行完上一任务,再执行下一任务,如果上一任务未执行完成,则这次的任务不执行,直到下一周期再判断,如果上一任务执行完成,则可以执行下一任务。

改进方法

我们可以使用一个锁文件,来记录任务是否执行中。
首先判断/tmp/sleep.lock是否存在,如果不存在,则创建,然后执行任务,任务执行完后删除锁文件。如果锁文件已经存在,则退出这次的任务。这样的确可以保证任务执行其间不会有新任务执行,但这样需要在任务文件中写代码做判断,不方便。能不能把任务锁定的判断放在任务以外呢?

lock是Linux下的文件锁。

当多个进程可能会对同样的数据执行操作时,这些进程需要保证其它进程没有也在操作,以免损坏数据。

通常,这样的进程会使用一个「锁文件」,也就是建立一个文件来告诉别的进程自己在运行,如果检测到那个文件存在则认为有操作同样数据的进程在工作。这样的问题是,进程不小心意外死亡了,没有清理掉那个锁文件,那么只能由用户手动来清理了。

使用linux flock 文件锁实现任务锁定,解决冲突

格式

flock [-sxun][-w #]
flock [-sxon][-w #] file [-c] command

选项

-s,--shared:获取一个共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功。
-x,-e,--exclusive:获取一个排它锁,或者称为写入锁,为默认项。
-u,--unlock:手动释放锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。
-n,--nb, --nonblock:非阻塞模式,当获取锁失败时,返回1而不是等待。
-w, --wait, --timeout seconds:设置阻塞超时,当超过设置的秒数时,退出阻塞模式,返回1,并继续执行后面的语句。
-o, --close:表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。
-c, --command command:在shell中执行其后的语句。

独占锁/排他锁

  • 设置锁
    使用计划任务执行sleep.sh,文件锁使用独占锁,如果锁定则失败不等待。这样当任务未执行完成,下一任务判断到/tmp/mytest.lock被锁定,则结束当前的任务,下一周期再判断。参数为-xn

*/2 * * * * flock -xn /opt/crontab_lock -c "/bin/bash /opt/sleep.sh >>/opt/sleep.log "

  • 创建独占锁/排他锁,加上等待超时/秒
    启动的定时任务等待了20秒后,上一个任务释放了锁,任务可以马上拿到锁,并继续执行

*/2 * * * * flock -x -w 20  /opt/crontab_lock -c "/bin/bash /opt/sleep.sh >>/opt/sleep.log "

crontab防止脚本周期内未执行完重复执行

个人体会: flock -xn my.lock commond
my.lock是一个文件,应该可以是任意文件,可以新建一个空文件
当flock 获得锁后就会执行后面的 commond
测试过程: $1: flock -xn my.lock sleep 20
              $2: flock -xn my.lock ls
只有当1返回后, 2的ls才会成功

crontab防止脚本周期内未执行完重复执行

如果某脚本要运行30分钟,可以在Crontab里把脚本间隔设为至少一小时来避免冲突。而比较糟的情况是可能该脚本在执行周期内没有完成,接着第 二个脚本又开始运行了。如何确保只有一个脚本实例运行呢?一个好用的方法是利用lockf(FreeBSD 8.1下为lockf,CentOS  5.5下为flock),在脚本执行前先检测能否获取某个文件锁,以防止脚本运行冲突。

lockf的参数如下。

-k:一直等待获取文件锁。

-s:silent,不发出任何信息,即使拿不到文件锁。

-t seconds:设定timeout的时间是seconds秒,如果超过时间,则自动放弃。

以下Crontab计划任务执行前,需获取临时文件create.lock的文件锁,此项Crontab计划任务的内容如下:

*/10 * * * * (lockf -s -t 0 /tmp/create.lock /usr/bin/python /home/project/cron/create_tab.py  >> /home/project/logs/create.log 2>&1)

若第一个实例在10分钟内没有运行完,第2个实例不会运行。我以前是通过Shell脚本来解决这个问题的,比如用while...do循环,然后放在后台执行。但后来发现其实用flock或lockf方法更为简单。

参考:https://www.jianshu.com/p/e1c55ffea1cb

https://ywnz.com/linux/flock/

https://blog.csdn.net/u014365655/article/details/38556875

linux使用flock文件锁解决脚本周期内未执行完重复执行相关推荐

  1. 如何解决Spring Data Maven构建的“生命周期配置未涵盖的插件执行”

    我正在尝试使用Spring Data和Neo4j . 我首先尝试遵循主站点链接的本指南 . 特别是,我的pom.xml基于" Hello,World!". 示例文件 . 这是导致问 ...

  2. linux下使用过的命令总结(未整理完)

    1.常用命令不需解释 ls\cd\cp\mv\pwd\file\vi\vim\cat 2.getconf LONG_BIT 终端返回32表示操作系统32位,返回64表示操作系统64位. 3.ifcon ...

  3. linux使用flock解决crontab任务冲突

    Linux的crontab最小的间隔是每分钟执行一次,但是如果在这一分钟之内,之前的命令并没有执行完成呢?这样就会产生冲突.接下来我介绍一个解决冲突的办法,那就是linux的flock文件锁. 格式: ...

  4. 集群部署中解决定时任务重复执行的问题-redis分布式锁应用

    背景描述 有小伙伴私信我,关于存在定时任务的项目在集群环境下部署如何解决重复执行的问题,PS:定时任务没有单独拆分. 概述:之前的项目都是单机器部署,所以定时任务不会重复消费,只会执行一次.而在集群环 ...

  5. shell脚本中等待上一条命令执行结束在执行下一条。

    首先了解下背景知识. 命令生效顺序 Linux系统下命令生效的顺序有以下4条: 绝对路径或相对执行的命令: 别名: Bash的内部命令: 按照$PATH环境变量定义的目录查找顺序搜到的第一个命令. 实 ...

  6. Pytest如何重复执行N次脚本

    [原文链接]Pytest如何重复执行N次脚本 在有些场景下,希望将自动化脚本重复执行多次,比如想看看自动化脚本的稳定性,还比如想利用功能测试用例直接进行压力测试,即对某一些脚本反复执行从而对应用产生压 ...

  7. 解决微信小程序 app onLaunch异步请求,在没有请求执行完就加载首页了的问题

    今天在调试小程序的过程中,进了一个坑,程序加载需要先获取用户信息,然后保存到Storage中,然后首页去 Storage取信息,根据用户信息去查本地服务器数据列表,可是发现第一次进入的时候,数据总是加 ...

  8. C#执行任务Task,如果任务超时的话就取消当前任务,重新执行,规定次数内执行成功则执行成功的委托,超过规定的次数则失败的委托

    在上位机和MES通信,尤其是上位机向MES发送数据的的时候,经常需要设置一个超时处理的时间和重复执行的次数.例如MES的超时响应事件是5秒,超过5秒的话,上位机重新访问MES一次,连续三次都超时的话, ...

  9. Linux flock文件锁详解

    摘要1:https://www.cnblogs.com/zhaojingyu/p/8955851.html 摘要2:https://www.cnblogs.com/wangxusummer/p/493 ...

最新文章

  1. window10+python3.7安装tensorflow--gpu tensorflow 安装
  2. FastDFS_install_document_detail
  3. vue.js 全局应用js_如何在不到7分钟的时间内测试您的Vue.js应用
  4. 微软更新Azure SQL将可根据重要性工作进行重整顺序
  5. 无迹卡尔曼滤波器(UKF)
  6. RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)
  7. Xcode证书路径和缓存清理路径
  8. 币安Binance API
  9. VTD的官方help翻译-ROD部分(5~9章)
  10. Matlab数字图像处理——图像复原
  11. 莫斯密码加密与解密--python加密篇
  12. jmeter---ftp性能测试
  13. 中国女性出席1899年伦敦世界妇女大会
  14. 外接Hdmi没有声音怎么设置
  15. html中边距属性,CSS边距属性
  16. 服务器2008修改虚拟内存,Windows 2008 关闭系统虚拟内存功能 如何删除pagefile.sys
  17. AndroidAPI
  18. 余淼杰老师 经济学原理复习笔记(微观)
  19. c语言上机题库程序设计,c语言上机程序设计题库及答案.pdf
  20. 【网络安全】Metasploit工具

热门文章

  1. 使用第三方推送平台JPUSH推送消息到android手机
  2. pythonflaskmock数据_Python3+Flask实现本地Mock数据
  3. 操作系统核心概念第二弹来了!
  4. 赢在微点答案专区英语_成人高考@赢在技巧
  5. System.Net.Sockets.TcpClient
  6. 从期货开户方式和出入金识别公司
  7. 数据分析师1.1量化交易系统介绍
  8. 事实、观点、立场与信仰
  9. react项目中引入百度地图
  10. ERP : 粉末冶金行业介绍