zoukankan      html  css  js  c++  java
  • linux使用——flock文件锁解决crontab脚本重复执行问题

    背景

    • 在Linux系统使用crontab配置一个定时任务后,出现一种情况,如果我设置的crontab任务时间是每隔1分钟执行一次任务脚本,但是这个脚本执行时间超过了1分钟,比如2分钟,这时系统会再执行任务。导致两个相同的任务在执行。这种情况下可能会出现一些并发问题,严重时会导致出现脏数据/性能瓶颈的恶性循环。

    处理

    • 思想
      • 利用Linux中的flock,将执行脚本的定时任务进程加上文件锁。
    • flock详解
      • 简介:
        • flock是对于整个文件的建议性锁。如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的。(建议性锁不强求进程遵守。)最棒的一点是,它的第一个参数是文件描述符,在此文件描述符关闭时,锁会自动释放。而当进程终止时,所有的文件描述符均会被关闭。
        • 当多个进程可能会执行同一个脚本,这些进程需要保证其它进程没有在操作,以免重复执行。通常,这样的进程会使用一个「锁文件」,也就是建立一个文件来告诉别的进程自己在运行,如果检测到那个文件存在则认为有操作同样数据的进程在工作。
      • 使用
    flock -h
    
    Usage:
     flock [options] <file|directory> <command> [command args]
     flock [options] <file|directory> -c <command>
     flock [options] <file descriptor number>
    
    Options:
    -s, --shared:    获得一个共享锁
    -x, --exclusive: 获得一个独占锁
    -u, --unlock:    移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁
    -n, --nonblock:  如果没有立即获得锁,直接失败而不是等待
    -w, --timeout:   如果没有立即获得锁,等待指定时间
    -o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控
    -c, --command:   在shell中运行一个单独的命令
    -h, --help       显示帮助
    -V, --version:   显示版本

    实例

    • 我的脚本如下
    */1 * * * * flock -xn /home/jingguoliang/project/sh/ordersleep.lock -c '/bin/sh /home/jingguoliang/project/sh/orderbiz.sh >/dev/null 2>&1'
    */1 * * * * flock -xn /home/jingguoliang/project/sh/paysleep.lock -c '/bin/sh /home/jingguoliang/project/sh/paybiz.sh >/dev/null 2>&1'
    • 脚本解释
      • flock -xn /home/jingguoliang/project/sh/paysleep.lock -c
        • 对后面的脚本进程加文件锁,格式为:flock 参数 锁文件地址 参数
      • '/bin/sh /home/jingguoliang/project/sh/paybiz.sh >/dev/null 2>&1'
        • 执行脚本地址及打印日志
        • 注意:一定要加上引号,否则脚本不执行!!!
  • 相关阅读:
    MVC5 Controller构造方法获取User为空解决方法
    js删除Array数组中的某个元素
    VS2015 工具箱 保存位置
    Mapper 赋值对应实体属性
    cookieHelper
    python3练习100题——007
    python3练习100题——006
    python3练习100题——005
    python3练习100题——004
    python3练习100题——003
  • 原文地址:https://www.cnblogs.com/zuiyue_jing/p/12557549.html
Copyright © 2011-2022 走看看