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'
- 执行脚本地址及打印日志
- 注意:一定要加上引号,否则脚本不执行!!!
- flock -xn /home/jingguoliang/project/sh/paysleep.lock -c