Linux集群,如何“仅仅”锁定一个文件?

2023-11-27

在 Bash 中,我试图使函数 getLock 与不同的锁名称一起使用。

function getLock
{
    getLock_FILE="${1}"
    getLock_OP="${2}"
    case "${getLock_OP}" in
        "LOCK_UN")
            flock -u "${getLock_FILE}"
            rm -fr "${getLock_FILE}"
            ;;
        "LOCK_EX")
            flock -x "${getLock_FILE}"
    esac
}

但羊群说flock: bad number: myfilelock

我怎样才能锁定一个文件,并在需要时释放它,而不必在集群中执行命令?

它的使用方式如下:

getLock myfilelock LOCK_EX
somecommands
........
getLock myfilelock LOCK_UN

要锁定文件:

exec 3>filename # open a file handle; this part will always succeed
flock -x 3      # lock the file handle; this part will block

要释放锁:

exec 3>&-       # close the file handle

您还可以按照集群手册页描述的方式进行操作:

{
  flock -x 3
  ...other stuff here...
} 3>filename

...在这种情况下,当块退出时文件会自动关闭。 (这里也可以使用子shell,通过使用( )而不是{ },但这应该是一个经过深思熟虑的决定——因为子 shell 会降低性能,并且会影响范围变量修改和其他状态更改)。


如果您运行的是足够新的 bash 版本,则无需手动管理文件描述符编号:

# this requires a very new bash -- 4.2 or so.
exec {lock_fd}>filename  # open filename, store FD number in lock_fd
flock -x "$lock_fd"      # pass that FD number to flock
exec {lock_fd}>&-         # later: release the lock

...现在,对于您的函数,我们将需要关联数组和自动 FD 分配(并且,为了允许从不同路径锁定和解锁同一文件,GNU readlink)——所以这不适用于较旧的 bash 版本:

declare -A lock_fds=()                        # store FDs in an associative array
getLock() {
  local file=$(readlink -f "$1")              # declare locals; canonicalize name
  local op=$2
  case $op in
    LOCK_UN)
      [[ ${lock_fds[$file]} ]] || return      # if not locked, do nothing
      exec {lock_fds[$file]}>&-              # close the FD, releasing the lock
      unset lock_fds[$file]                   # ...and clear the map entry.
      ;;
    LOCK_EX)
      [[ ${lock_fds[$file]} ]] && return      # if already locked, do nothing
      local new_lock_fd                       # don't leak this variable
      exec {new_lock_fd}>"$file"              # open the file...
      flock -x "$new_lock_fd"                 # ...lock the fd...
      lock_fds[$file]=$new_lock_fd            # ...and store the locked FD.
      ;;
  esac
}

如果您使用的平台上 GNU readlink 不可用,我建议替换readlink -f打电话给realpath from sh-realpath 作者:Michael Kropat(仅依赖于广泛可用的 readlink 功能,而不是 GNU 扩展)。

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

Linux集群,如何“仅仅”锁定一个文件? 的相关文章

  • bash 中 :-(冒号破折号)的用法

    bash中这种风格的含义是什么 PUBLIC INTERFACE eth0 目的是什么 If PUBLIC INTERFACE存在且不为null 则返回其值 否则返回 eth0 实际上有一些记录在bash 手册页 http linux di
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 将相对符号链接转换为绝对符号链接

    如何在 bash 中递归地将相对符号链接转换为绝对符号链接 ln sf readlink f link link
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何判断 Bash 中是否存在文件?

    这会检查文件是否存在 bin bash FILE 1 if f FILE then echo File FILE exists else echo File FILE does not exist fi 我如何只检查文件是否存在not ex
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • 动态参数值取决于另一个动态参数值

    启动前提 非常严格的环境 Windows 7 SP1 Powershell 3 0 使用外部库的可能性有限或不可能 我正在尝试重写之前创建的 bash 工具 这次使用 PowerShell 在 bash 中 我实现了自动完成功能 以使该工具
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的

随机推荐

  • 非凸优化器

    我使用 python2 7 需要找到多元标量函数的最大值 换句话说 我有这个功能 def myFun a b c d e f complex calculation that takes about 30 seconds return re
  • Python中的(1,)和(1)有什么区别[重复]

    这个问题在这里已经有答案了 正如标题所述 我发现 1 and 1 是不同的 但它们有什么区别呢 In 39 1 1 Out 39 False 试试这个来说服自己 gt gt gt type 1
  • 将 JavaScript 变量传递给 AngularJs ng-init

    我定义了以下 javascript 变量并需要传递memId值传入 AngularJs init 函数 div class mini 我收到错误 memId没有定义 您需要使用 角度 方式来完成此操作 window var app angu
  • 如何以最小的影响重新启动 CSS 动画

    有没有一种方法可以重新启动 CSS 动画 而无需克隆元素 回流 DOM 等待 setTimeout onAnimationEnd EDIT 无需 jQuery 或检查 我基本上只是在下一个绘制的帧处重新启动动画 此方法不会克隆任何元素 重排
  • 处理带有未知 IPv6 扩展标头的数据包

    Question 是否应该丢弃带有未知 IPv6 扩展标头的数据包 Details 我无法通过检查找到这个问题的答案RFC 这本书IPv6 要点第 22 页指出 如果节点需要下一个标头但无法识别下一个标头字段中的值 则需要丢弃该数据包并向数
  • 在C#中,如何可靠地杀死进程树[重复]

    这个问题在这里已经有答案了 在 C 中 我们使用以下代码来终止进程树 有时有效 有时无效 可能与 Windows 7 和 或 64 位有关 它找到给定进程的子进程的方法是调用GetProcesses获取系统中的所有进程 然后调用NtQuer
  • Airplay 按钮未显示在 AVPlayer 的播放器控件中

    我使用 AVPlayer 和 AVPlayerViewController 创建了一个视频播放器 我已经设定 allowsExternalPlayback 财产至真也 usesExternalPlaybackWhileExternalScr
  • apk (.apk) 和应用程序包 (.aab) 之间的区别

    最近谷歌推出了一个新功能app bundle这与 APK 的概念非常相似 除了灵活性和架构差异之外 我阅读了很多博客 文章来了解应用程序包与 APK 文件相比如何在设备中工作 App Bundle 的实际内部工作流程是什么 它如何在从 Go
  • 将标记替换为 html 内容

    我一直在搜索 Google Map API V3 文档 但找不到任何方法来使用我自己的 html 内容而不是图像在地图上创建自定义图标 我想显示一个动态标记 可以显示文本或我想要的任何内容 例如 div class marker Dynam
  • Java打印包含多个整数的字符串

    今天刚开始学习java 似乎无法弄清楚这一点 我正在关注 learnjavaonline org 上的教程 该教程会教您一些内容 然后要求您编写代码来执行特定操作 然后检查输出以查看其是否正确 问题是 如果它不正确 它不会说明原因 也不会为
  • Anaconda 安装后运行 pyinstaller 会导致 ImportError: no Module named 'pefile'

    I did conda install c acellera pyinstaller 3 2 3 as per Anaconda 的网站看起来它安装正确 但如果我尝试通过 cmd 运行它 我会得到以下信息 C Users Cornelis
  • 增加该值(如果存在),否则在 DynamoDB 中添加新条目

    我有一个 DynamoDB 表 其列和主键为ipAddress IP地址 visits 我从我的 React 网站获取用户的 IP 地址 并通过 Lambda 函数和 API Gateway POST 请求将其插入到 DynamoDB 如果
  • UIImages 的图像尺寸是 1024 x 1024?

    苹果文档指出 您应该避免创建大于 1024 x 的 UIImage 对象 大小为 1024 除了大量的内存之外 这样的图像还会 消耗 使用图像作为纹理时可能会遇到问题 在 OpenGL ES 中或将图像绘制到视图或图层时 这个尺寸 如果您正
  • Boost.Test 检查指针是否为空

    我有以下测试 BOOST CHECK NE pointer nullptr 编译失败的原因是 xxx include boost test tools detail print helper hpp 50 14 错误 operator 出了
  • 如果Java中的反射会减慢命令的执行速度,为什么还有这么多框架使用它?

    根据我的理解 使用 Java 反射 API 会按命令减慢代码执行速度 但后来我看到它在 Java 世界的很多地方都在使用 仅举几例 注释 Spring框架 AOP 休眠 MyBatis 这意味着我错过了一些关于 java 反射 又名优化技术
  • 使用 PostGIS 配置 Amazon Elastic Beanstalk

    有谁有使用 PostGIS 设置 Amazon Elastic Beanstalk 的经验 以便我可以利用 Geodjango 默认设置 RDS 以 MySQL 为特色 当前不支持开箱即用的许多功能 1 PostgreSQL PostGIS
  • 如何在 django 中验证 json 对象

    我正在使用 AJAX 向 django 视图提交 JSON JSON 如下所示 code 9910203040 required name Abc required payments amount 300 required name efg
  • winform 友好的类名

    我有一个 C winform 应用程序 当使用间谍 时 它给出 WindowsForms10 Window 8 app 0 33c0d9d 作为类名 有没有办法将其更改为更友好的内容 没有 最后一个十六进制数字是拥有该窗口的 AppDoma
  • 如何在 vim 中删除下一个字符(不是当前字符!)?

    我经常发现自己需要删除光标后面的字符 而不是当前字符 在 vim 的正常模式下执行此操作的最短方法是什么 lx会成功 或者lxh如果您想将光标返回到原始位置 它只是向前移动光标并删除其下方的字符 如果这还不够短 您可以将其映射到单个按键 m
  • Linux集群,如何“仅仅”锁定一个文件?

    在 Bash 中 我试图使函数 getLock 与不同的锁名称一起使用 function getLock getLock FILE 1 getLock OP 2 case getLock OP in LOCK UN flock u getL