1. 简述
某些脚本或程序需要确保单实例运行,如通过cron(8)定时任务执行mysqldump(1)数据库备份,此类任务通常耗时较长,因而每次执行都需占据较多的系统与网络资源,若由于误操作或其他原因而运行了同一任务的多个实例,则将导致不必要的资源浪费,以及其他可能的连锁问题。
shell脚本中可以通过util-linux软件包基于flock(2)系统调用提供的flock(1)工具,以文件锁的方式实现任务的单实例运行;文件锁在Linux系统中的实现可以参照上一篇博文 Linux文件锁实现之flock(2)与fcntl(2)
2. 用法
flock(1)命令包含3种形式:
flock 命令选项 加锁文件或目录 -c 不带参数的命令或脚本
flock 命令选项 加锁文件或目录 不带参数的命令或脚本 命令或脚本的参数
flock 命令选项 引用锁文件的文件描述符
第2种形式中,若命令或脚本的参数为空字符串,则等同于第1种形式。
主要命令行选项与参数包括:
-s, --shared:共享锁
-x, -e, --exclusive:独占锁,默认类型
-u, --unlock:解锁
-n, --nb, --nonblock:非阻塞,若指定的文件正在被其他进程锁定,则立即以失败返回
-w, --wait, --timeout seconds:若指定的文件正在被其他进程锁定,则等待指定的秒数;指定为0将被视为非阻塞
-o, --close:锁定文件后与执行命令前,关闭用于引用加锁文件的文件描述符
-E