Linux-flock文件锁的使用

在多个进程同时操做同一份文件的过程当中,很容易致使文件中的数据混乱,须要锁操做来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock。nginx


flock,建议性锁,不具有强制性。一个进程使用flock将文件锁住,另外一个进程能够直接操做正在被锁的文件,修改文件中的数据,缘由在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另外一个进程写入数据的状况,内核不会阻止这个进程的写入操做,也就是建议性锁的内核处理策略。

flock主要三种操做类型:
LOCK_SH,共享锁,多个进程可使用同一把锁,常被用做读共享锁;
LOCK_EX,排他锁,同时只容许一个进程使用,常被用做写锁;
LOCK_UN,释放锁;

进程使用flock尝试锁文件时,若是文件已经被其余进程锁住,进程会被阻塞直到锁被释放掉,或者在调用flock的时候,采用LOCK_NB参数,在尝试锁住该文件的时候,发现已经被其余服务锁住,会返回错误,errno错误码为EWOULDBLOCK。即提供两种工做模式:阻塞与非阻塞类型。shell

flock只能对整个文件加锁,不能对文件的一部分进行加锁。bash

 

运用示例以下:异步

vi test.shspa

#! /bin/bash
echo "Hello World"
sleep 10

touch test.lock #随便命名code

[root@localhost ~]# flock -xn ./test.lock -c "sh /root/test.sh"blog

 

运行中...进程

开启另一个bash窗口运行crontab

[root@localhost ~]# flock -xn ./test.lock -c "sh /root/test.sh"同步

 

 前面未获取到锁直接返回 直到其余运行完毕 这个才开始运行

 

计划任务中运用

1 crontab运用flock防止重复执行

* * * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 为非阻塞模式

2 机器down机自动启动或重启

能够在daemon开始的时候, 打开一个文件而后获取一个写锁. 守护脚本也打开文件并设置写锁, 而后阻塞, 一旦写锁得到成功, 则说明daemon已经挂了. 此时守护脚本重启daemon并放弃写锁.

运行

flock -x ./test.lock -c "/usr/local/nginx/sbin/nginx" #去掉-n表示使用阻塞模式

运行中...

再次执行

flock -x ./test.lock -c "/usr/local/nginx/sbin/nginx" #去掉-n表示使用阻塞模式

阻塞中...

 

模拟down机 

[root@localhost ~]# ps aux |grep "nginx"|grep"master"|grep -v "grep"|awk'{print $2}'|xargskill -9

 

kill后阻塞的命令立刻执行 新的进程PID立马产生,实现效果

 

附加flock参数

-s,--shared:获取一个共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其余进程试图在定向为此文件的FD上设置独占锁的请求失败,而其余进程试图在定向为此文件的FD上设置共享锁的请求会成功。
-x,-e,--exclusive:获取一个排它锁,或者称为写入锁,为默认项
-u,--unlock:手动释放锁,通常状况没必要须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分须要异步执行,一部分能够同步执行的状况。
-n,--nb, --nonblock:非阻塞模式,当获取锁失败时,返回1而不是等待-w, --wait, --timeout seconds:设置阻塞超时,当超过设置的秒数时,退出阻塞模式,返回1,并继续执行后面的语句-o, --close:表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。-c, --command command:在shell中执行其后的语句

相关文章
相关标签/搜索