• Linux 基于flock命令实现多进程并发读写文件控制


    基于flock命令实现多进程并发读写文件控制

    需求描述

    实际项目中,需要在Linux下通过shell脚本并发读写同一个文件,但是希望同一时刻,只有一个进程可以在读、写目标文件。

    解决方案

    使用flock命令。

    flock命令介绍

    语法

    # flock --help
    
    用法:
     flock [options] <file|directory> <command> [command args]
     flock [options] <file|directory> -c <command>
     flock [options] <file descriptor number>
    
    常用选项:
     -s  --shared             获取一个共享锁
     -x  --exclusive          获取一个排他锁(默认情况)
     -u  --unlock             移除一个锁
     -n  --nonblock           非阻塞模式,当获取锁失败时,返回1而非等待。
     -w  --timeout <secs>     阻塞模式,当获取锁失失败时,等待secs秒,超时后退出。默认情况下,会一直等待直到获取锁
     -E  --conflict-exit-code <number>  冲突或者超时导致程序退出时的退出状态码
     -o  --close              运行命令前,关闭文件描述符,会自动释放锁。
     -c  --command <command>  通过shell运行command,命令运行完成,也会自动释放锁(如果已上锁的话)
    

    原理

    flock命令通过给某个文件、目录上锁来告诉其它进程自己的状态,也就是说基于文件锁实现程序控制。

    支持的文件锁有两种:

    • 共享锁(shared lock)

      当文件被上了共享锁之后,其他进程可以继续为此文件加共享锁,但不能添加排他锁。被上锁的文件会有一个共享锁计数,每添加一个共享锁,计数 +1,每解锁一个共享锁,计数 -1,只有当共享锁计数为0时,才可以为其添加排他锁。

    • 排他锁(exclusive lock )

      当文件被上了排他锁之后,在解锁之前,其它进程不能为该文件添加共享锁和排他锁

    具体实践

    新建test_file_lock.sh文件,内容如下

    #!/bin/bash
    echo "----------------------------------"
    echo "start at `date '+%Y-%m-%d %H:%M:%S'`"
    sleep 30s
    echo "finished at `date '+%Y-%m-%d %H:%M:%S'`"
    

    打开3个Linux终端,分别在其中两个终端的相同路径下,执行以下命令

    # flock -x LOCK-FILE -c "sh test_file_lock.sh >out.log"
    

    执行上述命令以后,马上在第三个终端的相同路径下,执行tail -f out.log查看输出,结果如下

    #tail -f out.log
    ----------------------------------
    start at 2021-12-29 09:17:21
    finished at 2021-12-29 09:17:51
    tail: out.log: file truncated
    ----------------------------------
    start at 2021-12-29 09:17:51
    finished at 2021-12-29 09:18:21
    

    实践结果表明:

    1. 锁文件(例中为LOCK-FILE)如果不存在,会自动创建;
    2. 基于flock在第2个终端上执行的shell命令,在第一个终端上执行的shell命令执行完成后才开始运行,验证了flock排它锁的有效性。

    作者:授客
    QQ:1033553122
    全国软件测试QQ交流群:7156436

    Git地址:https://gitee.com/ishouke
    友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!
    作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!
               微信打赏                        支付宝打赏                  全国软件测试交流QQ群  
                  

  • 相关阅读:
    C#日期与时间
    使用IIS部署WebDAV
    永久有效,最新IntelliJ IDEA 2021.1.1激活破解教程,亲测有效
    LNC(宝元)机床的IP设置和数据采集
    KND(凯恩帝)机床的IP设置
    国密算法SM1-SM4简介
    WPF中根据数据展示不同UI控件的做法
    WPF中ListView滚动到当前行的几种方法
    WPF中对于异步返回的绑定
    .net类库名称空间冲突怎么办?
  • 原文地址:https://www.cnblogs.com/shouke/p/15758564.html
Copyright © 2020-2023  润新知