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

flock文件锁的学习和应用的更多相关文章

  1. linux使用flock文件锁解决crontab冲突问题

    * * * * * flock -xn /dev/shm/redis.lock -c "/usr/local/bin/redis-server" 可以用flock命令,配合使用rs ...

  2. linux使用flock文件锁

    使用linux flock 文件锁实现任务锁定,解决冲突 格式: flock [-sxun][-w #] fd# flock [-sxon][-w #] file [-c] command flock ...

  3. php flock 文件锁

    于php中文件锁函数flock函数用法简介,希望通过本文的介绍大家对于Linux方面能够更加的了解 flock (PHP 4, PHP 5) flock — 轻便的咨询文件锁定 说明 bool flo ...

  4. 使用linux flock文件锁实现任务锁定避免计划任务程序冲突

    格式:flock [-sxun][-w #] fd#flock [-sxon][-w #] file [-c] command选项-s, --shared: 获得一个共享锁 -x, --exclusi ...

  5. flock文件锁

    linux中的定时任务crontab会定时执行一些脚本,但是脚本的时间往往无法控制,当脚本的执行时间过长,可能会导致上一次任务的脚本还没执行完,下一次任务的脚本又开始执行的问题.这种情况下会出现一些并 ...

  6. 关于flock文件锁的阻塞与非阻塞

    阻塞模式,程序会一直等待. <?php $fp = fopen("lock.txt", "r"); if(flock($fp,LOCK_EX)) { // ...

  7. 20175226 2018-2019-2 《Java程序设计》第六周学习总结

    20175226 2018-2019-2 <Java程序设计>第六周学习总结 教材学习内容总结 内部类与异常类 内部类:Java支持在一个类中定义另一个类(可以是static类) 外嵌类的 ...

  8. flock

    为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态.作为锁机制中的一种,PHP的文件锁也是为了应对资源竞争.假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有 ...

  9. 20165223 《JAVA程序设计》第五周学习总结

    教材学习内容总结 第七章要点 内部类 匿名类 异常类 断言 第十章要点 File类 文件字节/字符的输入.输出流 缓冲流 随机流 数组流 数据流 对象流 序列化和对象克隆 使用Scanner解析文件 ...

随机推荐

  1. [转]C# Eval在asp.net中的用法及作用

    原文链接:http://www.cnblogs.com/Mr_JinRui/archive/2010/07/06/1772129.html Eval( " ")和Bind( &qu ...

  2. await和async

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. JS去重算法

    1.遍历数组法 它是最简单的数组去重方法(indexOf方法) 实现思路:新建一个数组,遍历去要重的数组,当值不在新数组的时候(indexOf为-1)就加入该新数组中: var arr=[2,8,5, ...

  4. canvas绘制线和矩形

    ###canvas绘制矩形 HTML中的元素canvas只支持一种原生的图形绘制:矩形.所有其他的图形的绘制都至少需要生成一条路径 1.绘制矩形 canvas提供了三种方法绘制矩形: ----> ...

  5. 【JZOJ6287】扭动的树

    description analysis 区间\(DP\),首先按照键值排个序,这样保证树的中序遍历就为原序列 设\(f[0][i][j]\)表示\([i..j]\)区间作为\([unknown..i ...

  6. 2018湖南NOIP集训报告7.15~7.26

    Day1 主打内容:dfs/bfs及其优化剪枝,以及贪心算法的应用. 老师:\(Gromah\) 不得不说这个老师真的是个有趣的强大怪... 今天讲的挺水的,其实就是搜索吧,也没啥好听的,追会儿小说\ ...

  7. VS2010-MFC(文档、视图和框架:概述)

    转自:http://www.jizhuomi.com/software/221.html 前面几节讲了菜单.工具栏和状态栏的使用,本节开始将为大家讲解文档.视图和框架的知识. 文档.视图和框架简介 在 ...

  8. 框架:Flutter(移动应用程序开发框架)

    ylbtech-框架:Flutter(移动应用程序开发框架) Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作. ...

  9. QT之QStatusBar

    1.QStatusBar一般处于主窗体(QMainWindow)的左下角用于显示比较重要的状态信息.我们通常调用其showMessage()函数 QT官方显示:[slot] void QStatusB ...

  10. iconfont 在vue项目中的应用(icon-component组件)

    前言:上一篇记录了iconfont的三种基本使用方法. 在Vue中应该如何使用呐?Vue中的组件化思想很明确,要提高组件的复用率,增强项目的可维护性,扩展性.以下是采用icontfont的使用方式之s ...