gpt4 book ai didi

linux - Bash 中的锁定文件 : Text file busy when running two copies at once

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:35 26 4
gpt4 key购买 nike

我有一个 Bash 脚本,它需要在运行时锁定文件以进行独占读/写。在此期间,正在运行的同一脚本的任何其他副本都应该挂起,直到锁定被释放(这应该很快)。

#!/bin/bash

trap "rm -f /tmp/.lock; exit" 0 1 2 3 15

(
flock -x 100

# Stuff happens here...

) 100>/tmp.lock

这有点管用。但不是在这些条件下:

  1. 开始脚本副本#1
  2. 开始脚本副本#2
  3. 在脚本副本#2 结束之前结束脚本副本#1

此时,我得到了错误:

rm: cannot remove '/tmp/.lock': Text file busy

我认为我是如何用陷阱清理东西的完全错误,所以任何帮助将不胜感激。谢谢!

最佳答案

永远不要只要持有该锁的任何程序可能正在运行或试图运行,就尝试“清理”flock 样式的锁文件。

请记住,锁定的是 inode ,而不是文件名。删除目录条目会将先前位于该位置的 inode 与其名称分离,从而允许该名称引用不同的 inode。

考虑以下场景:

  1. 程序 A 持有锁。
  2. 程序 B 打开锁文件并尝试获取锁,阻塞直到程序 A 完成锁。
  3. 程序 A 完成;关闭锁;并删除锁定文件。
  4. 程序 B 仍然持有已删除的锁定文件的句柄。当程序 A 关闭锁(或退出,释放其文件句柄,从而释放其锁)时,程序 B 能够继续运行,并持有该句柄作为其锁。
  5. 程序 C 试图获取锁。 即使程序B还在运行,由于程序B持有的锁文件句柄被程序A删除,程序C被允许并发运行。
  6. 程序 B 退出,删除程序 C 创建的锁定文件,而程序 C 仍在运行。

Flock-file lockfiles 应该被认为是从文件系统命名空间到文件锁定命名空间的映射。这些映射不需要也不应该被“清理”。您可能希望考虑您的操作系统的文件系统层次结构标准是否为此类文件提供了一个存放位置,例如 /var/lock,或 tmpfs 上的某处(其中“cleanup "将在重新启动时隐式且安全地发生)。

关于linux - Bash 中的锁定文件 : Text file busy when running two copies at once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29758928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com