【Linux】flock 文件级别的锁定

flock 是 Linux/Unix 系统中的一个命令,用于实现文件级别的锁定。它允许你在多个进程之间共享对文件的访问,但确保在同一时间只有一个进程可以访问文件,避免竞态条件(race conditions)和数据不一致问题。

flock 的基本概念

flock(file lock)是文件锁的实现,它使用文件描述符来锁定文件。通过 flock,你可以在同一时间内对一个文件加锁,使得只有一个进程能访问该文件。其他进程尝试访问时会等待或者直接失败,具体行为取决于锁的模式。

flock 既支持 共享锁(多个进程可以读取文件)也支持 排它锁(只有一个进程可以写入文件)。

flock 的使用场景

  1. 防止多个进程同时执行同一任务:常用于任务调度中,确保某个任务在同一时间内只有一个实例在运行。
  2. 同步进程访问共享资源:当多个进程访问共享文件或资源时,使用 flock 可以避免同时修改文件而引发的竞态条件。
  3. 锁定配置文件或日志文件:确保同一时间只有一个进程可以修改或写入日志文件、配置文件等。

flock 的命令格式

flock [options] <file> <command>
  • <file>:要锁定的文件。它是一个普通文件,可以是一个空文件,也可以是一个日志文件或其他进程共享的文件。
  • <command>:要执行的命令。如果命令执行成功,flock 会自动释放文件锁。

flock 的常用选项

  • -n--nonblock:非阻塞模式。如果文件已经被锁定,flock 不会等待锁的释放,而是立即退出并返回错误。
  • -x--exclusive:排他锁。只有一个进程可以获得文件锁,其他进程必须等待直到锁被释放。
  • -s--shared:共享锁。多个进程可以获得共享锁,通常用于读取文件,不会阻止其他进程对文件进行共享读取。
  • -w <timeout>--wait <timeout>:等待指定的时间(单位:秒),如果超时则退出。这个选项适用于阻塞模式,在获取锁时设置最大等待时间。
  • -u--unlock:显式释放锁。

flock 的工作模式

flock 可以以两种方式工作:

  1. 阻塞模式(默认):如果文件已经被锁定,flock 会等待锁释放,然后执行命令。
  2. 非阻塞模式:如果文件已经被锁定,flock 会立即退出,不会等待锁释放。

flock 示例

示例 1:在 crontab 中确保同一时间只有一个进程运行

假设你有一个 Python 脚本,且你希望确保这个脚本每分钟执行一次,但如果上一个实例正在运行,则跳过当前的执行。

你可以在 crontab 中结合 flock 来实现这一目标:

* * * * * /usr/bin/flock -n /tmp/my_task.lockfile /usr/bin/python3 /path/to/your/script.py

解释:

  • /usr/bin/flock -n /tmp/my_task.lockfile:尝试获取 /tmp/my_task.lockfile 文件的锁。如果该文件已经被锁定(即其他进程正在运行),则不等待直接退出。
  • /usr/bin/python3 /path/to/your/script.py:要执行的 Python 脚本。

这种方式确保了每分钟执行一次脚本,但如果上一个脚本实例还在运行,新任务会因无法获得锁而跳过。

示例 2:用 flock 来控制任务

假设你有一个任务需要写入日志文件,并且你希望确保在同一时间只有一个进程能访问这个文件进行写入。你可以使用 flock 来锁定该文件。

flock /tmp/my_task.lockfile echo "任务开始执行 $(date)" >> /path/to/logfile.log

解释:

  • flock /tmp/my_task.lockfile:对 /tmp/my_task.lockfile 文件加锁。
  • echo "任务开始执行 $(date)" >> /path/to/logfile.log:将任务执行的日志写入 /path/to/logfile.log 文件。

如果有多个进程尝试执行这个命令,它们会先后获取锁,确保不会同时写入日志文件。

示例 3:在 Bash 脚本中使用 flock

你可以将 flock 集成到你的 Bash 脚本中,确保某些操作只在一个进程中运行:

#!/bin/bash# 获取文件锁
(flock -n 200 || exit 1  # 如果文件已经被锁定,退出脚本echo "任务正在执行..."  # 任务执行的逻辑sleep 60  # 模拟任务的执行过程
) 200>/tmp/my_task.lockfile

解释:

  • flock -n 200:对文件描述符 200 加锁。文件描述符 200 绑定到 /tmp/my_task.lockfile 文件。
  • || exit 1:如果文件已被锁定,退出脚本。
  • 文件锁是基于文件描述符的,因此你需要将文件描述符与一个实际的文件(如 /tmp/my_task.lockfile)关联起来。
示例 4:阻塞模式与超时模式
flock -w 10 /tmp/my_task.lockfile echo "任务开始执行"

这个命令将等待最多 10 秒,如果在这段时间内无法获得锁,它将退出并返回错误。

总结

  • flock 是一个用于在 Linux/Unix 系统中实现文件锁定的命令,常用于确保同一时间只有一个进程执行某个任务。
  • 通过 flock,你可以在多个进程之间进行同步,避免竞态条件。
  • 它支持阻塞模式(默认)和非阻塞模式,可以在 crontab 中使用,确保同一任务不会同时执行。
  • 你可以在脚本中使用 flock 通过锁定文件来控制资源的访问,避免多个进程同时修改文件或执行任务。

这种方法对于需要避免重复执行的定时任务、日志文件的写入等场景非常有效。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/65363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案

问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…

Redis6为什么引入了多线程?

大家好&#xff0c;我是锋哥。今天分享关于【Redis6为什么引入了多线程&#xff1f;】面试题。希望对大家有帮助&#xff1b; Redis6为什么引入了多线程&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 6 引入了多线程的主要目的是提高性能&#…

【模块一】kubernetes容器编排进阶实战之kubernetes 资源限制

kubernetes 资源限制 kubernetes中资源限制概括 1.如果运行的容器没有定义资源(memory、CPU)等限制&#xff0c;但是在namespace定义了LimitRange限制&#xff0c;那么该容器会继承LimitRange中的 默认限制。 2.如果namespace没有定义LimitRange限制&#xff0c;那么该容器可…

Rancher V2.9.0 Docker安装教程

1、创建Rancher挂载目录 mkdir -p /home/rancher/k3s/agent/images/ 2、复制容器中的镜像tar包&#xff0c;防止挂载之后镜像包丢失导致创建集群报错 避免&#xff1a;Internal error occurred: failed calling webhook "default.cluster.cluster.x-k8s.io" dock…

CPT203 Software Engineering 软件工程 Pt.1 概论和软件过程(中英双语)

文章目录 1.Introduction1.1 What software engineering is and why it is important&#xff08;什么是软件工程&#xff0c;为什么它很重要&#xff09;1.1 We can’t run the modern world without software&#xff08;我们的世界离不开软件&#xff09;1.1.1 What is Soft…

从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)

前言 本文记录使用 Coding (以 Jenkinsfile 为核心) 和 Docker 部署 Springboot 项目的过程&#xff0c;分享设置细节和一些注意问题。 1. 配置服务器环境 在实施此过程前&#xff0c;确保服务器已配置好 Docker、MySQL 和 Redis&#xff0c;可参考下列链接进行操作&#xff1…

[WASAPI]音频API:从Qt MultipleMedia走到WASAPI,相似与不同

[WASAPI] 从Qt MultipleMedia 来看WASAPI 最近在学习有关Windows上的音频驱动相关的知识&#xff0c;在正式开始说WASAPI之前&#xff0c;我想先说一说Qt的Multiple Media&#xff0c;为什么呢&#xff1f;因为Qt的MultipleMedia实际上是WASAPI的一层封装&#xff0c;它在是线…

绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图

clc clear close all %% 读取数据 load(MyColor.mat) %读取颜色包for iloop 1:25 %提取工作表数据data0(iloop) {readtable(data.xlsx,sheet,iloop)}; end%% 解析数据 countzeros(23,14); for iloop 1:25index(iloop) { cell2mat(table2array(data0{1,iloop}(1,1)))};data(i…

第三百四十六节 JavaFX教程 - JavaFX绑定

JavaFX教程 - JavaFX绑定 JavaFX绑定同步两个值&#xff1a;当因变量更改时&#xff0c;其他变量更改。 要将属性绑定到另一个属性&#xff0c;请调用bind()方法&#xff0c;该方法在一个方向绑定值。例如&#xff0c;当属性A绑定到属性B时&#xff0c;属性B的更改将更新属性A…

详解VHDL如何编写Testbench

1.概述 仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型&#xff0c;它为所测试的元件提供了激励信号&#xff0c;可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中&#xff0c;也可以从…

RNA-Seq 数据集、比对和标准化

RNA-Seq 数据集、比对和标准化|玉米中的元基因调控网络突出了功能上相关的调控相互作用。 RNA-Seq 表达分析代码和数据 该仓库是一个公开可用 RNA-Seq 数据集的集合&#xff08;主要是玉米数据&#xff09;&#xff0c;提供了系统分析这些数据的代码/流程&#xff0c;以及质量…

学技术学英文:Spring AOP和 AspectJ 的关系

AspectJ是AOP领域的江湖一哥&#xff0c; Spring AOP 只是一个小弟 Spring AOP is implemented in pure Java. There is no need for a special compilation process. Spring AOP does not need to control the class loader hierarchy and is thus suitable for use in a ser…

JVM学习-内存结构(二)

一、堆 1.定义 2.堆内存溢出问题 1.演示 -Xmx设置堆大小 3.堆内存的诊断 3.1介绍 1&#xff0c;2都是命令行工具&#xff08;可直接在ideal运行时&#xff0c;在底下打开终端&#xff0c;输入命令&#xff09; 1可以拿到Java进程的进程ID&#xff0c;2 jmap只能查询某一个时…

Browser Use:AI智能体自动化操作浏览器的开源工具

Browser Use:AI智能体自动化操作浏览器的开源工具 Browser Use 简介1. 安装所需依赖2. 生成openai密钥3. 编写代码4. 运行代码5. 部署与优化5.1 部署AI代理5.2 优化与扩展总结Browser Use 简介 browser-use是一个Python库,它能够帮助我们将AI代理与浏览器自动化操作结合起来;…

Spring Cloud——注册中心

介绍 什么是注册中心&#xff1f; 主要负责服务的注册与发现&#xff0c;确保服务之间的通信顺畅&#xff0c;具体来说&#xff0c;注册中心有以下主要功能&#xff1a;‌服务注册、服务发现、服务健康检查。 服务注册&#xff1a; 服务提供者在启动时会向注册中心注册自身服务…

CSS基础入门【2】

目录 一、知识复习 二、权重问题深入 2.1 同一个标签&#xff0c;携带了多个类名&#xff0c;有冲突&#xff1a; 2.2 !important标记 2.3 权重计算的总结 三、盒模型 3.1 盒子中的区域 3.2 认识width、height 3.3 认识padding 3.4 border 作业&#xff1a; 一、知识…

捋一捋相关性运算,以及DTD和NLP中的应用

捋一捋相关性运算&#xff0c;以及DTD和NLP中的应用 相关性和相干性,有木有傻傻分不清相关性数字信号的相关运算同维度信号的相关理解 相关--互相关--相干 回声消除过程如何套用这些知识相关性/相干性检测在DT中的应用时域的标量与向量结合的互相关方法适合block处理的频域相干…

Elasticsearch:normalizer

一、概述 ‌Elastic normalizer‌是Elasticsearch中用于处理keyword类型字段的一种工具&#xff0c;主要用于对字段进行规范化处理&#xff0c;确保在索引和查询时保持一致性。 Normalizer与analyzer类似&#xff0c;都是对字段进行处理&#xff0c;但normalizer不会对字段进…

go语言的成神之路-筑基篇-对文件的操作

目录 一、对文件的读写 Reader?接口 ?Writer接口 copy接口 bufio的使用 ioutil库? 二、cat命令 三、包 1. 包的声明 2. 导入包 3. 包的可见性 4. 包的初始化 5. 标准库包 6. 第三方包 ?7. 包的组织 8. 包的别名 9. 包的路径 10. 包的版本管理 四、go mo…

【入门】拐角III

描述 输入整数N&#xff0c;输出相应方阵。 输入描述 一个整数N。&#xff08; 0 < n < 10 ) 输出描述 一个方阵&#xff0c;每个数字的场宽为3。 用例输入 1 5 用例输出 1 5 5 5 5 55 4 4 4 45 4 3 3 35 4 3 2 25 4 3 2 1 来源 二维数组…