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)

大家都在看

  • 机器学习导引

    三种范式 常常定义一种损失函数,对训练集进行处理时使其最小化。该函数代表了系统输出对于正确输出的错误率,因为训练集的给定的输出是正确的 学习数值型预测函数,比如房价预测模型 在训练…

    Linux 2023年6月7日
    072
  • Linux系统调用接口

    Linux系统调用接口 进程控制 系统调用 描述 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 终止进程 _exit 立即终止…

    Linux 2023年6月13日
    0107
  • django queryset列表合并

    import itertools queryset_top = query.filter(is_top=True).order_by("-updated_at"…

    Linux 2023年6月14日
    070
  • 2021年3月-第01阶段-Linux基础-Linux系统概念-Linux命令

    Linux系统基本概念 图形界面: Ctrl+Shift +号 //调整命令终端变大 Ctrl – 号 //调整命令终端变小 命令终端: ~ 家目录:用户的私有场所,其…

    Linux 2023年6月8日
    0106
  • Putty&Psftp命令行实现自动登录

    | 0.18分钟 | 292.8字符 | 1、引言&背景 2、解决方案 3、声明与参考资料 | SCscHero | 2022/1/22 PM6:0 | 系列 | 已完成 …

    Linux 2023年5月27日
    0102
  • gerrit系统如何配置访问控制

    .版本:v0.3作者:河东西望日期:2022-7-13. gerrit系统的上手使用有两个难点: 想要上手使用gerrit的同仁们,搭建部署好gerrit系统之后,会发现gerri…

    Linux 2023年6月7日
    098
  • 目录遍历漏洞

    一.目录遍历漏洞原理目录遍历(路径遍历)是由于Web服务器或者Web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器…

    Linux 2023年6月14日
    0106
  • Python Docstring 风格和写法学习

    什么是Python Docstring 和Java类似,Python也通过注释形式的Docstring给程序、类、函数等建立文档。通过Docstring建立的文档不仅对人来说有更好…

    Linux 2023年6月14日
    0103
  • MongoDB安装使用教程

    MongoDB安装使用教程 介绍 MongoDB是一个基于分布式文件存储的数据库,是一个文档数据库,支持的数据结构非常松散,是类似json的bson格式,可以存储比较复杂的数据类型…

    Linux 2023年6月6日
    0101
  • springboot redis key乱码

    原写法: 写入redis后,查看key值 解决方式: 调整后查看redis key值: Original: https://www.cnblogs.com/janes/p/8796…

    Linux 2023年5月28日
    098
  • Docker Manager for Docker Swarm deploy

    一、Swarm概述 Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swa…

    Linux 2023年6月14日
    0115
  • Linux文件属性详述

    一、文件属性信息概述 文件属性信息组成如下: 文件索引属性信息——inode编号; 文件类型权限信息; 文件链接属性信息——硬链接数; 文件属主信息——文件所有者; 文件属组属性信…

    Linux 2023年5月27日
    0103
  • Jmeter 使用Json提取请求数据-2

    在接口测试中有一个这样的场景:业务接口需要用到登录token;下个接口需要用到前个接口返回值作为参数,该怎么实现? 首先先看下登录、业务接口,本文用的jmeter版本为5.4.1 …

    Linux 2023年6月8日
    0105
  • mysql-高可用架构:MHA

    mysql-高可用架构:MHA 1. MHA简介 MHA(Master High Availability)是由日本人yoshinorim开发的一款成熟且开源的MySQL高可用程序…

    Linux 2023年6月13日
    086
  • 【原创】Linux虚拟化KVM-Qemu分析(十一)之virtqueue

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    086
  • k8s之部署metrics-server 转载

    Metrics Server是Kubernetes内置自动缩放管道的可扩展,高效的容器资源指标来源。 Metrics Server从Kubelet收集资源指标,并通过Metrics…

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