目录
场景
在多个进程同时操做同一份文件的过程当中,很容易致使文件中的数据混乱,须要锁操做来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock。
简介
flock,建议性锁,不具有强制性。一个进程使用flock将文件锁住,另外一个进程能够直接操做正在被锁的文件,修改文件中的数据,缘由在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另外一个进程写入数据的状况,内核不会阻止这个进程的写入操做,也就是建议性锁的内核处理策略。
原理
flock
命令通过给某个文件、目录上锁来告诉其它进程自己的状态,也就是说基于文件锁实现程序控制。
支持的文件锁有两种:
-
共享锁(
shared lock
)当文件被上了共享锁之后,其他进程可以继续为此文件加共享锁,但不能添加排他锁。被上锁的文件会有一个共享锁计数,每添加一个共享锁,计数 +1,每解锁一个共享锁,计数 -1,只有当共享锁计数为0时,才可以为其添加排他锁。
-
排他锁(
exclusive lock
)当文件被上了排他锁之后,在解锁之前,其它进程不能为该文件添加共享锁和排他锁
语法
flock [options] <file|directory> <command> [command args]
flock [options] <file|directory> -c <command>
flock [options] <file descriptor number>
file:被锁的文件
选项
简 | 详 | 说明 |
---|---|---|
-s | --shared | 共享锁,或者称为读锁 |
-u | --unlock | 手动释放锁,一般情况不必须,当FD关闭时,系统会自动解锁 |
-w | --wait --timeout seconds | 设置阻塞超时,当超过设置的秒数时,退出阻塞模式,返回1 |
-x -e | --exclusive | 获取一个排它锁,或者称为写锁,为默认项 |
-n -nb | --nonblock | 非阻塞模式,当获取锁失败时,返回1而不是等待 |
-c | --command | 在shell中执行其后的语,用于如果命令产生子进程时会不受锁的管控 |
-V | --version | 显示版本 |
-h | --help | 显示帮助 |
-o | --close | 在运行命令前关闭文件的描述符号, |
参考
示例
定时任务常用,锁文件(例中为/tmp/stargate.lock
)如果不存在,会自动创建
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'