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 ...
随机推荐
- 如何从0-1了解 熟悉 精通gitlab
加入gitlab团队项目: 打开其他用户极狐邀请邮件: 点击接受紫色邀请按钮"accept invitation": 选择免费试用90天saas服务: 使用邮箱注册进行邮箱验证[验 ...
- Android 12(S) MultiMedia(十二)MediaCodecList & IOmxStore
这节来了解下MediaCodecList相关代码路径: frameworks/av/media/libstagefright/MediaCodecList.cpp frameworks/av/medi ...
- linux扩展分区
linux扩展分区 1.准备工作 系统版本:ubuntu20.04 工具:一个安装了ubuntu系统的系统U盘或者ubuntu系统制作的启动盘 2.缩小分区 要扩展某一个分区,再没有空闲空间时需要从其 ...
- MySQL学习笔记-数据操作语言
SQL-数据操作语言(DML) 数据操作语言,用于对数据库中表的数据记录进行增删改的操作 一.添加数据(insert) 1. 给指定字段添加数据 insert into {表名} ({字段1},{字段 ...
- Manim使用心得
Manim 使用心得 manim 做视频还是挺方便的. 当然,如果你每一次都从 0 开始写,那么你会崩溃. 所以需要找到自己做视频的风格,以此总结出一套通用的 python 模板代码,然后调用. 例如 ...
- LeetCode 678. Valid Parenthesis String 有效的括号字符串 (C++/Java)
题目: Given a string containing only three types of characters: '(', ')' and '*', write a function to ...
- 使用极限网关助力 ES 集群无缝升级、迁移上/下云
在工作中大家可能会遇到以下这些场景: 自建 ES 集群需要平滑迁移到 XX 云: 从 XX 云将 ES 集群迁移到自建机房: ES 集群进行跨版本升级,同时保留回退能力: 这些场景往往都还有个共同的需 ...
- SRE 排障利器,接口请求超时试试 httpstat
夜莺资深用户群有人推荐的一个工具,看了一下真挺好的,也推荐给大家. 需求场景 A 服务调用 B 服务的 HTTP 接口,发现 B 服务返回超时,不确定是网络的问题还是 B 服务的问题,需要排查. 工具 ...
- 燕千云 YQCloud 数智化业务服务平台 发布1.12版本
2022年4月29日,燕千云 YQCloud 数智化业务服务平台发布1.12版本,优化客户服务场景.深化智能预测服务的应用,加强系统在多渠道方面的集成,全面提升企业数智化服务的能力! 作为企业数字化服 ...
- 制作Jdk镜像
本文介绍用Dockerfile的方式构建Jdk镜像,请保证安装了Docker环境. 首先创建/opt/jdk目录,后续步骤都在该目录下进行操作. 准备好Jdk安装文件,放到/opt/jdk目录下. 编 ...