【问题标题】:Locking Files in Bash在 Bash 中锁定文件
【发布时间】:2014-04-25 18:09:39
【问题描述】:

我在 bash 中找到一个关于锁定文件的好概念时遇到了问题,

基本上我想实现以下目标:

  1. 锁定文件
  2. 读入文件中的数据(多次)
  3. 处理数据。
  4. 将新内容写入文件(不一定要写入末尾)
  5. 解锁该文件

对我来说,用flock 做这件事似乎是不可能的,因为文件描述符只会移动一次到文件的末尾。

创建临时文件也会失败,因为我可能会覆盖已经读取的行,这也是不可能的。

编辑:
另请注意,我无法控制的其他脚本可能会尝试写入该文件。

所以我的问题是如何在第 1 步中创建一个锁,以便它跨越第 2、3、4 步,直到我在第 5 步中再次解锁?

【问题讨论】:

  • 给定一个file,您可以在步骤1中创建一个临时file.lock并在步骤5中将其删除。在步骤2-4中,检查file.lock是否存在。
  • 嗯,也许我需要稍微修改一下这个问题!我不能确定不是我的脚本的另一个工具正在访问它!
  • 如果文件存在并且“另一个工具”具有有效的读/写权限,您将无法避免在脚本中发生这种情况。如果可以的话,您可以考虑更改文件的权限,或者将文件重命名/mv 到安全的地方并对其进行操作,完成所有操作后,将文件移动/重命名为其原始名称/位置。跨度>
  • @Kent 我知道我不能阻止程序,因为锁不是强制性的。但我仍然想锁定那个文件。尽管移动可能会奏效,但如果脚本停止或计算机关闭,可能会产生不必要的副作用,例如丢失该文件

标签: bash io locking flock


【解决方案1】:

可以使用flock 实用程序执行此操作。您只需要获取flock 即可使用单独的只读文件描述符,即打开文件两次。例如。使用中间临时文件对文件进行排序:

(
    flock -x -w 10 100 || exit 1

    tmp=$(mktemp)

    sort <"$file" >"$tmp"

    cat "$tmp" > "$file"

    rm -f "$tmp"
) 100<"$file"

flock 将为您的文件发出flock() 系统调用,如果它已被锁定,则阻止它。如果超过了超时,那么脚本将中止并显示错误代码。

【讨论】:

  • 有趣的是昨天已经在调查羊群,但没有成功。无论如何,改变你的解决方案效果很好!
猜你喜欢
  • 2015-03-29
  • 2014-11-09
  • 2021-05-28
  • 2021-06-21
  • 1970-01-01
  • 2010-10-04
  • 2015-10-18
相关资源
最近更新 更多