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

需求描述

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

解决方案

使用 flock命令。

flock 命令介绍

flock --help

用法:
 flock [options]   [command args]
 flock [options]  -c
 flock [options]

常用选项:
 -s  --shared             获取一个共享锁
 -x  --exclusive          获取一个排他锁(默认情况)
 -u  --unlock             移除一个锁
 -n  --nonblock           非阻塞模式,当获取锁失败时,返回1而非等待。
 -w  --timeout      阻塞模式,当获取锁失失败时,等待secs秒,超时后退出。默认情况下,会一直等待直到获取锁
 -E  --conflict-exit-code   冲突或者超时导致程序退出时的退出状态码
 -o  --close              运行命令前,关闭文件描述符,会自动释放锁。
 -c  --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:51
finished at 2021-12-29 09:18:21

实践结果表明:

Original: https://www.cnblogs.com/shouke/p/15758564.html
Author: 授客
Title: Linux 基于flock命令实现多进程并发读写文件控制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524214/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SQL中连接(JOIN)子句介绍

    本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法。 说明:本文的用法示例是面向 MyS…

    Linux 2023年6月13日
    072
  • 高通MSM8998 ABL的调试

    高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel)。高通UEFI由XBL和ABL两部分组成。XBL负责芯片驱动及充电等核心应用功能。ABL包括芯片无关…

    Linux 2023年6月7日
    072
  • 计算机硬件的读写速度差异

    现代计算机系统 存储器 寄存器 CPU时钟周期 高速缓存 主存 固态硬盘 机械硬盘 压榨CPU性能带来的问题 有序性问题 可见性问题 原子性问题 作者:小牛呼噜噜 | https:…

    Linux 2023年6月6日
    0119
  • Python 之Memcache中间件

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载,它通过在内存中缓存数据和减少读取数据库的次数,从而提高动态数据库驱动网站的速度。Mem…

    Linux 2023年6月14日
    089
  • MIT6.828(Step0)——实验环境配置

    实验环境配置 VirtualBox虚拟机为载体,安装Ubuntu $ uname -a Linux eliot-VirtualBox 5.11.0-36-generic #40~2…

    Linux 2023年5月27日
    085
  • Red Hat Enterprise Linux (RHEL) 9 更新了什么,即 Rocky Linux 9 和 AlmaLinux 9 展望

    请访问原文链接:https://sysin.org/blog/rhel-9-vision/,查看最新版。原创作品,转载请保留出处。 作者:gc(at)sysin.org,主页:ww…

    Linux 2023年5月27日
    0101
  • [转]EVE-NG 中使用 SecureCRT 合并tab标签

    在EVE-NG中双击设备使用SecureCRT对设备进行调试连接时,会出现每次连接不同设备时都会打开一个新的SecureCRT窗口,而不是在一个窗口中添加一个新的标签页,这就会导致…

    Linux 2023年6月8日
    094
  • lambda跨账号调用elasticache redis调查结果

    1.本地lambda与被调用方的redis都要绑定一个VPC,至少设定一个子网和路由表,设定好安全组; 2.本地VPC创建对等连接,被调用方接受连接; 3.将各自的IPv4 CID…

    Linux 2023年5月28日
    066
  • typesafe_cb

    callback 回调函数 什么是callback function 如图(来自维基百科),回调函数提供了一种服务,可以由用户决定使用怎么样的服务(登记回调函数)。回调函数机制,提…

    Linux 2023年6月8日
    095
  • Paxos 协议简单介绍

    一、简介 Paxos 协议是少数在工程实践中证实的强一致性、高可用的去中心化分布式协议。Google 的很多大型分布式系统都采用了 Paxos 算法来解决分布式一致性问题,如 Ch…

    Linux 2023年6月16日
    0131
  • 10分钟轻松学会 Python turtle 绘图

    先说明一下turtle绘图的基础知识: 1. 画布(canvas) 画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置 1.1 设置画布大小 turtle…

    Linux 2023年6月8日
    090
  • 【论文笔记】Towards Certifying l-infinity robustness using neural networks with l-infinity-dist neurons

    原文地址 slides GitHub 代码 本文发表于 2021 ICML,提出了一个新颖的神经网络计算方式:对于网络中的每个神经元,不采用传统的线性转换+非线性激活函数的方式,而…

    Linux 2023年6月7日
    073
  • Centos7 找回root密码

    在开机界面,按”e”进入编辑界面 按”e”进图下图界面后,找到开头为”linux16″行,在行后面加入 &#…

    Linux 2023年5月27日
    0130
  • LVS+KeepAlived高可用部署架构

    1 构建高可用集群 1.1 什么是高可用集群 高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的得服务器集群技…

    Linux 2023年6月13日
    072
  • XXE漏洞学习

    0x00 XXE漏洞介绍: 背景:2018-7-4 微信支付SDK漏洞(XXE漏洞),攻击者可以获取服务器中目录结构,文件内容,eg:代码,各种 私钥。敏感数据泄露 0x01什么是…

    Linux 2023年6月6日
    097
  • Spring事务(一)-事务配置

    事务是数据库操作最基本的单元,是逻辑上的一组操作,这一组操作在同一个会话中要么都执行成功,要么都失败,这也是事务的最基本特性–原子性。事务的作用是为了保证系统数据的正确…

    Linux 2023年6月6日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球