简介
当多个进程操作同一份资源时,为了避免损坏数据, 每个进程在运行时都要保证其它进程没有同时操作资源, 这时通过flock命令给资源加锁可以实现此需求。flock - 在打开的文件上应用或删除咨询锁
命令flock [options] [command args]
flock [options] -c
flock [options]
options:-s, -share 读锁,共享锁
-x, -e, --exclusive 写锁,独占锁,这是默认值
-u, --unlock 解锁,通常不需要解锁,因为在文件关闭时会自动解锁
-n, --nonblock 无法立刻获取锁定时退出,而不是等待
-w, --timeout 几秒内无法获取锁定则退出
-E, --conflict-exit-code exit code after conflict or timeout
-o, --close close file descriptor before running command
-c, --command 提供一个字符串形式的shell命令来执行
-h, --help display this help and exit
-V, --version output version information and exit
示例[root@localhost ~]# flock -s ~/test.lock -c "sleep 10" &
#加读锁
[1] 1854
[root@localhost ~]# flock -x ~/test.lock -c "echo 1"
#等待10s上面的进程自动释放读锁,并加写锁
1
[1]+ Done flock -s ~/test.lock -c "sleep 10"
[root@localhost ~]# flock -s ~/test.lock -c "sleep 10" &
[1] 1911
[root@localhost ~]# flock -u ~/test.lock -c "echo 1"
#释放锁
1
[root@localhost ~]# flock -s ~/test.lock -c "sleep 10" &
[1] 1935
[root@localhost ~]# flock -xn ~/test.lock -c "echo 1"
#无法获取写锁,立刻退出,不执行命令
[root@localhost ~]#
[root@localhost ~]# flock -s ~/test.lock -c "sleep 10" &
[1] 1942
[root@localhost ~]# flock -x -w 3 ~/test.lock -c "echo 1"
#等待3s,仍然不能获取写锁,退出不执行命令
[root@localhost ~]#
配合cron
通常的需求是,对于一个脚本,希望每分钟执行一次,但是又要保证每次脚本运行的时候其他脚本没有运行,也就是常说的保证单进程运行,这时就可以用到flock命令。
比如:#如果能成功获取test.lock文件独占锁, 则执行test.sh脚本,否则不执行
* * * * * /usr/bin/flock -xn /tmp/test.lock -c './test.sh'
另外因为cron设置时间间隔的最低级别是分钟,我们还可以配合sleep命令,将脚本设置交个提升到秒级别。
比如:#每分钟内间隔10s尝试获取对应文件的独占锁,如果能获取成功,执行test.sh脚本,否则不执行。
#保证每分钟最多有6个进程在同时进行。
* * * * * sleep(10); /usr/bin/flock -xn /tmp/test10.lock -c './test.sh'
* * * * * sleep(20); /usr/bin/flock -xn /tmp/test20.lock -c './test.sh'
* * * * * sleep(30); /usr/bin/flock -xn /tmp/test30.lock -c './test.sh'
* * * * * sleep(40); /usr/bin/flock -xn /tmp/test40.lock -c './test.sh'
* * * * * sleep(50); /usr/bin/flock -xn /tmp/test50.lock -c './test.sh'
* * * * * sleep(60); /usr/bin/flock -xn /tmp/test60.lock -c './test.sh'
参考: