【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…

pytorch将数据与模型都放到GPU上训练

默认是CPU&#xff0c;如果想要用GPU需要&#xff1a; 安装配置cuda&#xff0c;然后更新/下载支持gpu版本的pytorch&#xff0c;可以参考&#xff1a;https://blog.csdn.net/weixin_35757704/article/details/124315569设置device&#xff1a;device torch.device(cuda if t…

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…

MongoDB 创建用户、User、Role 相关 操作

创建用户 # db.createUser() Creates a new user.详细 查看 db.createUser() - MongoDB Manual v8.0 设置用户 Role&#xff08;创建用户时也可以设置&#xff09; # db.grantRolesToUser() Grants a role and its privileges to a user. 详细 查看 db.grantRolesToUser(…

v-if 和 v-show 的区别

一、原理区别 1. v-if 这是一个指令&#xff0c;用于条件性地渲染一个元素块。当v-if表达式的值为true时&#xff0c;元素及其包含的子元素才会被渲染到 DOM 中&#xff1b;当表达式的值为false时&#xff0c;元素及其子元素会被完全移除。这意味着在切换v-if的条件时&#x…

从 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…

SVN和Git

SVN&#xff08;Subversion&#xff09;和 Git 都是流行的版本控制系统&#xff08;VCS&#xff09;&#xff0c;但它们在架构、使用场景、功能等方面有所不同。以下是它们的主要区别、各自的好处以及如何使用它们的详细说明。 一、SVN 和 Git 的区别 1. 版本控制模型 SVN&…

Spring Boot自定义注解获取当前登录用户信息

写在前面 在项目开发过程中&#xff0c;难免都要获取当前登录用户的信息。通常的做法&#xff0c;都是开发一个获取用户信息的接口。 如果在本项目中&#xff0c;多处都需要获取登录用户的信息&#xff0c;难不成还要调用自己写的接口吗&#xff1f;显然不用&#xff01; 以…

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

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

详解VHDL如何编写Testbench

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

深度学习:从原理到搭建基础模型

引言: 深度学习为什么火? 深度学习在处理复杂的感知和模式识别任务方面展现出了前所未有的能力。以图像识别为例,深度学习模型(如卷积神经网络 CNN)能够识别图像中的各种物体、场景和特征,准确率远超传统的计算机视觉方法。 当然这之中也还因为 大数据时代的推动(随着…

c语言中void关键字的含义和用法

在 C 语言中&#xff0c;void 是一个特殊的关键字&#xff0c;主要有以下几个用途&#xff1a; 1. 表示函数没有返回值 当一个函数不需要返回任何值时&#xff0c;可以将其返回类型声明为 void。 #include <stdio.h>void printMessage() {printf("Hello, World!\…

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只能查询某一个时…