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'
      • 执行脚本地址及打印日志
      • 注意:一定要加上引号,否则脚本不执行!!!
posted @ 2020-03-25 09:38  话·醉月  阅读(1465)  评论(0编辑  收藏  举报