Linux 为脚本加锁flock

在使用crontab管理定时脚本时,如果设定的脚本执行时间间隔较短,例如5分钟执行一次,正常情况下,脚本执行耗时1分钟,在非正常情况下(如服务器压力较大的情况下,或数据量突然增大),脚本执行时间超过5分钟,这时就会造成多个脚本同时执行,严重时甚至拖垮服务器,影响服务器上的其它服务。

flock介绍

当多个进程可能会执行同一个脚本,这些进程需要保证其它进程没有在操作,以免重复执行。通常,这样的进程会使用一个锁文件,也就是建立一个文件来告诉别的进程自己在运行,如果检测到那个文件存在则认为有操作同样数据的进程在工作。

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:   显示版本

flock基本使用

flock -xn "/tmp/f.lock" -c "/root/a.sh"

下图是两个终端同时运行这条命令,后执行者会因为抢不到锁而得不到执行,马上退出

flock为脚本加锁

了解flock了,我们就可以对周期性计划任务的脚本进行改进

5 * * * * flock -xn /services/scripts/update_mysql_data.lock -c 'sh /services/scripts/update_mysql_data.sh'
赞(3)
未经允许不得转载:极客笔记 » Linux 为脚本加锁flock
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址