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

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

需求描述

实际项目中,需要在Linux下通过​​shell​​脚本并发读写同一个文件,但是希望同一时刻flock是什么意思,只系统运维工程师有一个进程可以在读、写目标文件。

https://www.fons.com.cn/tag/%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" target="_blank">解决方案

使用​​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,命令运行完成,也会自动释放锁(如果已上锁的话)

linux

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

支持的文件锁有两种:

  • 共享锁(​​shared lockflocked to​)
    当文件被上了共享锁之后,其他进程可以继续为此文件加共享锁文件锁定了怎么解锁,但不能添加排他锁。被上锁的文件会有一个共享锁计数,每添加一个共享锁windows10,计数 +1,每解锁一个共享锁,计数 -1,只有当共享锁计数为0时,才可以为其添加排他锁。
  • 排他锁(​​exclusive lock ​​)
    当文件被上了排他锁之后,在解锁之前,其它进程不能为该文件添加共享锁和排他锁

具体实践

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

#!/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终端,分别在其中两个终linux系统端的相同路径下,执行以下命令

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

执行上述命令以后flocks,马上在第三个终端的相同路径下,执行​​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命令,在第一个终端上执行的shelflockedl命令windows7旗舰版执行完成后才开始运行,验证了​​flock​​排它锁linux重启命令的有效性。

作者:​​授客​​

全国软件linux测试QQ交流群:​​7156436​​

Git地址:​​​https并发性白内障://gitee.c文件锁定了怎么解锁om/ishouke​​​

友情提示:限于时间仓促,文中可能存在错误,欢并发量迎指正、评论!