Linux shell flock详解,Linux shell:Flock简介

2023-05-16

简介

当多个进程操作同一份资源时,为了避免损坏数据, 每个进程在运行时都要保证其它进程没有同时操作资源, 这时通过flock命令给资源加锁可以实现此需求。flock - 在打开的文件上应用或删除咨询锁

命令flock [options] [command args]

flock [options] -c

flock [options]

options:-s, -share 读锁,共享锁

-x, -e, --exclusive 写锁,独占锁,这是默认值

-u, --unlock 解锁,通常不需要解锁,因为在文件关闭时会自动解锁

-n, --nonblock 无法立刻获取锁定时退出,而不是等待

-w, --timeout 几秒内无法获取锁定则退出

-E, --conflict-exit-code exit code after conflict or timeout

-o, --close close file descriptor before running command

-c, --command 提供一个字符串形式的shell命令来执行

-h, --help display this help and exit

-V, --version output version information and exit

示例[root@localhost ~]# flock -s ~/test.lock -c "sleep 10" &

#加读锁

[1] 1854

[root@localhost ~]# flock -x ~/test.lock -c "echo 1"

#等待10s上面的进程自动释放读锁,并加写锁

1

[1]+ Done flock -s ~/test.lock -c "sleep 10"

[root@localhost ~]# flock -s ~/test.lock -c "sleep 10" &

[1] 1911

[root@localhost ~]# flock -u ~/test.lock -c "echo 1"

#释放锁

1

[root@localhost ~]# flock -s ~/test.lock -c "sleep 10" &

[1] 1935

[root@localhost ~]# flock -xn ~/test.lock -c "echo 1"

#无法获取写锁,立刻退出,不执行命令

[root@localhost ~]#

[root@localhost ~]# flock -s ~/test.lock -c "sleep 10" &

[1] 1942

[root@localhost ~]# flock -x -w 3 ~/test.lock -c "echo 1"

#等待3s,仍然不能获取写锁,退出不执行命令

[root@localhost ~]#

配合cron

通常的需求是,对于一个脚本,希望每分钟执行一次,但是又要保证每次脚本运行的时候其他脚本没有运行,也就是常说的保证单进程运行,这时就可以用到flock命令。

比如:#如果能成功获取test.lock文件独占锁, 则执行test.sh脚本,否则不执行

* * * * * /usr/bin/flock -xn /tmp/test.lock -c './test.sh'

另外因为cron设置时间间隔的最低级别是分钟,我们还可以配合sleep命令,将脚本设置交个提升到秒级别。

比如:#每分钟内间隔10s尝试获取对应文件的独占锁,如果能获取成功,执行test.sh脚本,否则不执行。

#保证每分钟最多有6个进程在同时进行。

* * * * * sleep(10); /usr/bin/flock -xn /tmp/test10.lock -c './test.sh'

* * * * * sleep(20); /usr/bin/flock -xn /tmp/test20.lock -c './test.sh'

* * * * * sleep(30); /usr/bin/flock -xn /tmp/test30.lock -c './test.sh'

* * * * * sleep(40); /usr/bin/flock -xn /tmp/test40.lock -c './test.sh'

* * * * * sleep(50); /usr/bin/flock -xn /tmp/test50.lock -c './test.sh'

* * * * * sleep(60); /usr/bin/flock -xn /tmp/test60.lock -c './test.sh'

参考:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux shell flock详解,Linux shell:Flock简介 的相关文章

  • 有哪些基于对象的 shell?

    我打算写一个面向对象的shell 基于Python 我已经有很多想法了 但在实现它之前 我想通过一些现有的 shell 来激发我的灵感 我所说的面向对象的基本意思是 参数不仅仅是字符串数组 而且是对象数组 返回值也是一个对象 不仅有 std
  • system 和 shell_exec 之间的区别

    有什么区别shell exec and systemPHP 中的方法 两者都采用单个命令行参数并在 PHP 中运行 使用其中一种比另一种更好吗 请参阅此处的解释 http chipmunkninja com Program Executio
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • Bash 中所有匹配的^单词^替换^?

    为了澄清 我正在寻找一种方法来执行global搜索并替换先前使用的命令 word replacement 似乎只替换了第一场比赛 有没有一些set我无法选择的选项 尝试这个 echo oneone oneone gs one two Rep
  • 在压缩存档内的文本文件上运行“head”,而不解压存档

    问候 我接手了之前的团队并编写了处理 csv 文件的 ETL 作业 我在 ubuntu 上结合使用 shell 脚本和 perl csv 文件很大 它们以压缩档案形式到达 解压后 很多都超过 30Gb 是的 那是 G 旧进程是在 cron
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include

随机推荐

  • Spring MVC原理及配置

    Spring MVC原理及配置 1 Spring MVC概述 Spring MVC是Spring提供的一个强大而灵活的web框架 借助于注解 xff0c Spring MVC提供了几乎是POJO的开发模式 xff0c 使得控制器的开发和测试
  • vue 复制功能 复制到剪切板

    首先 使用npm安装依赖 npm install save vue clipboard2 然后在main js中注入 复制到剪切板 import VueClipboard from 39 vue clipboard2 39 Vue use
  • git.教程资料

    1 Git使用教程 最详细 xff0c 最傻瓜 xff0c 最浅显 xff0c 真正手把手教 qq 36150631的博客 CSDN博客 html xff08 https blog csdn net qq 36150631 article
  • maven(私库)上传jar包

    在实际开发过程中 xff0c 我们经常会遇到需要引用的jar依赖 xff0c 在我们公司的maven仓库不存在 xff0c 这个时候我们就需要把jar上传上去 xff0c 在项目中添加对应依赖就OK了 步骤1 下载jar 在http mvn
  • [Vue warn]: Duplicate keys detected: '0'. This may cause an update error.

    1 Vue warn Duplicate keys detected 39 0 39 This may cause an update error 第一眼看到这个错误一脸懵逼 xff0c 项目使用很久了 xff0c 代码也没有改过 xff0
  • jsp 实现修改和删除功能

    main jsp 实现查询 在此界面快捷方式到修改界面 点击修改 会把数据传递到exit jsp 修改 edit jsp 前面数据 xff1a 数据库 xff1a 1 2 Navicat Premium Data Transfer 3 4
  • [nginx]invalid number of arguments

    invalid number of arguments nginx出现以下的错误 xff0c 基本上错误的原因就是少了后面的分号导致 invalid number of arguments in 34 include 34 directiv
  • HDU 2246 考研路茫茫——考试大纲

    HDU 2246 考研路茫茫 考试大纲 聽說這題要打表999 43 就傻傻的從0 N一個個地貼在代碼上了 打了幾個文件 xff0c 一同學就說我錯了 xff0c 杯具 因為提交上去的代碼長度不能超64K 白打了 xff0c 不過提示我測試數
  • MariaDB简介

    一 什么是数据库 DB 与 DBMS xff1a DB xff08 DataBase xff09 即数据库 xff0c 存储已经组织好的数据的容器 DBMS xff08 DataBase Manage System xff09 是数据库管理
  • 面试问题之操作系统:动态链接库和静态链接库的区别

    动态链接库是一个可以被其它应用程序共享的程序模块 xff0c 其中封装了一些可以被共享的例程和资源 动态链接库文件名的扩展名一般是dll xff0c 也有可能是drv xff0c sys和fon xff0c 它和可执行文件 exe 非常类似
  • linux中使用Crontab定时执行java的jar包无法使用环境变量的问题

    1 crontab简单使用 cmd 其实就是5个星星的事情 xff0c 随便百度一下吧 5个时间标签用来标注执行的设定 比如每5分钟执行一次 5 cmd 要特别注意 2 有些命令在命令行里执行很好 xff0c 到了crontab里面不能正常
  • Linux内核版本介绍与查询

    Linux内核版本命名在不同时期有着不同的规范 xff0c 在涉及到Linux版本问题时经常容易混淆 xff0c 主线版本 xff0f 稳定版 xff0f 长期支持版本经常搞不清楚 xff0c 本文主要记录下内核版本命名的规则以及如何查看L
  • kvm介绍

    KVM Kernel Based Virtual Machines 是一个基于Linux内核的虚拟化技术 可以直接将Linux内核转换为Hypervisor xff08 系统管理程 序 xff09 从而使得Linux 内核能够直接管理虚拟机
  • linux安装Topicons Plus解决图标不显示问题

    安装TopIcons Plus地址 https extensions gnome org extension 1031 topicons 1 点击链接下载安装包 然后解压 2 把解压后的文件包 移动到此路径下 xff1a usr share
  • 图像缩放算法(最临近点插值算法、双线性内插值算法、双立方插值算法)

    1 最临近点插值算法 xff1a 当一张 xff08 N M xff09 大小的图像放大到 xff08 xff08 j N xff09 xff08 k M xff09 xff09 时 xff0c 那么两张图像之间的像素点存在对应关系 xff
  • C语言float是什么类型,float是什么数据类型?

    float是浮点型数据类型 float是C语言的基本数据类型中的一种 xff0c 表示单精度浮点数 C语言规定单精度浮点型在内存占用4个字节 xff0c 精度为7位 xff0c 取值范围为 xff1a 3 4 10 38 3 4 10 38
  • 服务器文件 修改,服务器文件修改

    服务器文件修改 内容精选 换一换 远程连接Linux云服务器报错 xff1a Module is unknown修改此问题需要重启进入救援模式 xff0c 请评估风险后进行操作 本节操作涉及云服务器重启操作 xff0c 可能会导致业务中断
  • linux 批量重启机器脚本,(Linux) 一键批量启动、停止、重启Jar包Shell脚本

    废话不多说 xff0c 直接上脚本 xff0c 我这里是以spring cloud项目做的示例 bin sh export EUREKA 61 family eureka 1 0 0 jar export GATEWAY 61 family
  • python用post提交数据_python通过post提交数据的方法

    本文实例讲述了python通过post提交数据的方法 分享给大家供大家参考 具体实现方法如下 xff1a coding cp936 import urllib2 import urllib def postHttp name 61 None
  • Linux shell flock详解,Linux shell:Flock简介

    简介 当多个进程操作同一份资源时 xff0c 为了避免损坏数据 xff0c 每个进程在运行时都要保证其它进程没有同时操作资源 xff0c 这时通过flock命令给资源加锁可以实现此需求 flock 在打开的文件上应用或删除咨询锁 命令flo