flock文件锁 学习与应用 

2016-9-20

作用:

  可以使用flock文件锁,避免指定命令的同时执行。(实现任务锁定,解决冲突)

用法:

  # flock -xn /opt/lock_file -c 'echo "123"'  加了flock限制后,检查到文件已被锁定,则继续等待或直接返回失败。

说明:

1. 锁文件不存在,会自动创建。

2. 命令进程执行完毕后,锁会自动释放。

参数解释:  

-s, --shared:    获得一个共享锁  (命令可以同时执行)
-x, --exclusive: 获得一个独占锁 (锁被释放才会开始执行命令)
-u, --unlock: 移除一个锁(通常用不到,脚本执行完会自动释放锁)
-n, --nonblock: 如果没有立即获得锁,直接返回1失败,不等待. (非阻塞模式)
-w, --timeout: 如果没有立即获得锁,等待指定时间s
-o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控 (表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。) -c, --command: 在shell中运行一个单独的命令
-h, --help 显示帮助
-V, --version: 显示版本

补充说明:

共享锁:允许多个线程同时获取锁,并发访问

独占锁

-o 举例:

  不加-o参数。./down.sh执行完毕后,锁继续保留。(nohup后台运行的进程会继续持有锁)

        VM05:/opt/*/bin # lsof |grep /opt/test.lk
VM05:/opt/*/bin # ./down.sh
VM05:/opt/*/bin # flock -x /opt/test.lk -c '/opt/*/*/run.sh';echo $?
GATE START
0
VM05:/opt/*/bin # lsof |grep /opt/test.lk
java 98329 root 3u REG 202,9 0 19 /opt/test.lk
VM05:/opt/*/bin # ps 98329
PID TTY STAT TIME COMMAND
98329 pts/1 Sl 0:08 /usr/java/jdk1.6.0_29/bin/java -DProc=...

  加上-o参数。run.sh执行完毕后,锁释放。(run.sh的子进程不会持有锁。)

        VM05:/opt/*/bin # ./down.sh
VM05:/opt/*/bin # lsof |grep /opt/test.lk
VM05:/opt/*/bin # flock -xo /opt/test.lk -c '/opt/*/bin/run.sh';echo $?
GATE START
0
VM05:/opt/*/bin # lsof |grep /opt/test.lk
VM05:/opt/*/bin #

@其他具体实践运用:

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表示使用阻塞模式

最新文章

  1. 利用scrapy和MongoDB来开发一个爬虫
  2. 【leetcode】Search for a Range
  3. 自定义View(二)增加View的属性
  4. 设计模式之美:Visitor(访问者)
  5. mysqli扩展库的预处理技术 mysqli stmt
  6. Mac OS X 懒人版安装教程(之前的图全部挂了,所以重发了)
  7. 【HAOI2006】【BZOJ1051】【p1233】最受欢迎的牛
  8. Java中List与Map初始化的一些写法
  9. 判断IE版本的语句 [if lte IE 6]...[endif]
  10. 利用if else 判断方程有几个根
  11. Spring 3.2 ClassMetadataReadingVisitor 错误
  12. 黑马程序员_Java泛型
  13. windows+Ubuntu双系统 windows引导修复
  14. Visual Studio 2013 上使用 Github
  15. 使用Atom打造无懈可击的Markdown编辑器
  16. 技术大牛是如何拿到国内IT巨头offer的?
  17. (五) vivi代码分析
  18. ruby 升级1.8.7到1.9.3
  19. HDU 3535 AreYouBusy 经典混合背包
  20. Mysql链接字符串问题

热门文章

  1. C 删除字符串中某个指定的字符
  2. MySQL中查询所有数据库占用磁盘空间大小
  3. 关于pip安装较慢的问题解决
  4. openwrt xfrp移植
  5. 关于Modelsim安装闪退
  6. 关于OpenLiveWriter出错的修补方法
  7. [JZOJ6258] 【省选模拟8.9】轰炸
  8. VC6 Release下,生成pdb文件
  9. VS2010-MFC(常用控件:编辑框Edit Control)
  10. Java-Maven-pom.xml-project-dependencies:dependencies