-
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
实践结果表明:
-
锁文件(例中为
LOCK-FILE
)如果不存在,会自动创建; -
基于
flock
在第2个终端上执行的shell命令,在第一个终端上执行的shell命令执行完成后才开始运行,验证了flock
排它锁的有效性。
作者:授客
本文版权归原作者所有,仅供学习参考之用,转载请注明出处:https://www.cnblogs.com/shouke/p/15758564.html,未经作者允许请务必保留此段声明!
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式