背景
- 在Linux系统使用crontab配置一个定时任务后,出现一种情况,如果我设置的crontab任务时间是每隔1分钟执行一次任务脚本,但是这个脚本执行时间超过了1分钟,比如2分钟,这时系统会再执行任务。导致两个相同的任务在执行。这种情况下可能会出现一些并发问题,严重时会导致出现脏数据/性能瓶颈的恶性循环。
处理
- 思想
- 利用Linux中的flock,将执行脚本的定时任务进程加上文件锁。
- flock详解
- 简介:
- flock是对于整个文件的建议性锁。如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的。(建议性锁不强求进程遵守。)最棒的一点是,它的第一个参数是文件描述符,在此文件描述符关闭时,锁会自动释放。而当进程终止时,所有的文件描述符均会被关闭。
- 当多个进程可能会执行同一个脚本,这些进程需要保证其它进程没有在操作,以免重复执行。通常,这样的进程会使用一个「锁文件」,也就是建立一个文件来告诉别的进程自己在运行,如果检测到那个文件存在则认为有操作同样数据的进程在工作。
- 使用
- 简介:
1 | flock -h |
实例
- 我的脚本如下
1 | */1 * * * * flock -xn /home/jingguoliang/project/sh/ordersleep.lock -c '/bin/sh /home/jingguoliang/project/sh/orderbiz.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'- 执行脚本地址及打印日志
- 注意:一定要加上引号,否则脚本不执行!!!