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
排它锁的有效性。
Linux 基于flock命令实现多进程并发读写文件控制的更多相关文章
- linux系统常用命令 -设置文件夹读写权限
设置文件夹的读写权限: sudo chmod -R 777 /data 权限码描述 sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读 ...
- linux的exec命令
linux的exec命令可以多进程执行,如果在浏览器访问使用http协议,会存在内存溢出和执行时间问题.
- Linux Shell多进程并发以及并发数控制
1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...
- linux 多进程并发服务__关于子进程回收的方法
以TCPServ 服务程序来说: 1)父进程:负责系统初始化,以及监听(listen),接受连接请求(accept);其中accept 默认阻塞调用. 2)每接受一个连接请求,动态新建(fork)一个 ...
- 用flock命令解决Linux计划任务重复执行
在做计划任务的时候,可能由于某些问题,任务没有执行完成,导致任务重复的运行,解决这个问题,只需要一个flock命令就可以了. flock --helpflock (util-linux-ng 2.17 ...
- php中并发读写文件冲突的解决方案
在这里提供4种高并发读写文件的方案,各有优点,可以根据自己的情况解决php并发读写文件冲突的问题. 对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些!用一般的文件操作方法完全没有问题.但如果 ...
- php中并发读写文件冲突的解决方案(文件锁应用示例)
PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...
- linux文件锁flock【转】
转自: https://www.cnblogs.com/kex1n/p/7100107.html linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要 ...
- Linux(三)——Unix&Linux 的基础命令
Linux(三)--Unix&Linux 的基础命令 快捷键 Ctl-A 光标移动到行首 Ctl-C 终止命令 Ctl-D 注销登录 Ctl-E 光标移动到行尾 Ctl-U 删除光标到行首的所 ...
- LINUX系统VMSTAT命令详解
linux系统vmstat命令详解 [转自 https://www.cnblogs.com/wensiyang0916/p/6514820.html] vmstat 1 1表示每秒采集一次vms ...
随机推荐
- 7.28考试总结(NOIP模拟26)[神炎皇·降雷皇·幻魔皇]
或许只需一滴露水,便能守护这绽放的花朵. 前言 疯狂挂分,本来T2是想用树状数组优化一下的不知道为啥后来看了一下就少看了一层循环, 然后就想,我都 n 的复杂度了,足以搞过第一问了,还优化啥呀.... ...
- 调试YOLOv3/YOLOv5过程中遇到的问题汇总
今日立冬 yolov1 yolo1论文 https://www.bilibili.com/video/BV15w411Z7LG yolo2论文 https://www.bilibili.com/vid ...
- 搭建单机版伪分布式Hadoop+Scala+spark
搭建单机版伪分布式Hadoop+Scala+spark 修改ip [root@master ~]# nmcli connection add ifname ens32 con-name ens32 a ...
- 剑指Offer-47.求1+2+3+...+n(C++/Java)
题目: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 分析: 利用短路与来判断n是否大于0,从而实现递 ...
- Linux扩展篇-shell编程(四)-shell条件判断
基本语法 格式一: test condition 格式二: [ condition ] 注意:1)condition前后要有空格.2)条件非空即为true,例如[ hello ]返回true,[ ]返 ...
- shell基础概述
1.0 编程的目的 计算机的发明,是为了用机器取代/解放人力,而编程的目的则是将人类的思想流程按照某种能够被计算机识别的表达方式传递给计算机,从而达到让计算机能够像人脑/电脑一样自动执行的效果. 编程 ...
- lovelive - μ's
Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` lovelive - μ's 日期:2017-12-16 ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(2)
1.问题描述: 能否设置点击地图,地图标记上的文字不消失? 解决方案: 你好,这个功能设计本身就是点击屏幕marker的信息窗消失:如果用户只是想信息窗中的文字一直展示,可以不用信息窗实现 ,建议可以 ...
- Xilinux PS与PL交互::Linux-App读写REG
Xilinux PS与PL交互::Linux-App读写REG 背景 PL配置好有关的硬件,PS端做验证. 设计方案:针对REG地址,不使用设备树配置. 遇到的问题:暂无. 验证目的 验证PL-PS的 ...
- Vs生成后 自动压缩 删除多余xml
setlocal enabledelayedexpansionset ProjectName=$(ProjectName)del /s /q /f "$(ProjectDir)bin\Deb ...