使用flock和lockfile在bash中锁定文件

时间:2015-01-30 01:20:54

标签: bash

我花了一天的大部分时间寻找这个问题的解决方案,我想我已接近边缘......我需要在bash中做的是:编写1个脚本,定期读取你的输入并写下它们进入一个文件和第二个脚本,它将定期打印出完整的文件,但只有当新的内容写入时,这意味着它永远不会一个接一个地写入2个相同的输出。 2个脚本需要通过锁定来进行通信,这意味着脚本1将锁定文件,以便脚本2无法打印出任何内容,然后脚本1将在该文件中写入新内容并将其解锁(然后脚本2可以打印更新后的文件 )。 我们得到的唯一提示是使用flock和lockfile - 没有得到任何关于如何使用它们的提示,解决这个问题必须通过flock或lockfile来解决。

编辑:当我说我正在寻找一个解决方案时,我尝试了每一个鸡群与这些旗帜的组合,我无法让它发挥作用。

我会编写我想要做的伪代码。这里需要注意的是,这个伪代码基本上和在C中完成的一样。它很简单,我不知道为什么一切都必须在bash中如此复杂。

脚本1:

锁定文件text.txt(没有其他人可以读取或写入) 读输入 将输入放入文件中(不删除以前的文本) 删除文件text.txt上的锁定 重复

脚本2:

打印出完整的text.txt(但只有在没有锁定的情况下,如果它被锁定,显然你不能) 重复

由于脚本2一直在重复,因此只有在写入新内容时才会打印完整的text.txt。

我有大约100个其他命令,比如flock,我必须在很短的时间内学习,而且我只花了1天时间用于其中一个命令。你至少可以给我一个暗示。至于手册页......

我试着做一些像flock -x text.txt -c read> text.txt,尝试过其他所有组合,但没有任何效果。它只需要1个命令,不接受参数。我甚至不知道为什么有命令选项。我只是想让它锁定文件,写入它然后解锁它。在c中它只需要flock(“text.txt”,..)。

1 个答案:

答案 0 :(得分:6)

让我们来看看它的作用:

flock -x text.txt -c read > text.txt

首先,它会打开test.txt进行写入(并截断所有内容) - 在执行任何其他操作之前,包括调用flock

第二次,它告诉flock获取文件的独占锁并运行命令read

但是,read是一个内置的shell,而不是一个外部命令 - 所以它根本不能被非shell进程调用,从而阻止它本来可能产生的任何影响。 / p>


现在,让我们尝试使用flock手册页建议使用它的方式:

{
  flock -x 3                       # grab a lock on file descriptor #3
  printf "Input to add to file: "  # Prompt user
  read -r new_input                # Read input from user
  printf '%s\n' "$new_input" >&3   # Write new content to the FD
} 3>>text.txt                      # do all this with FD 3 open to text.txt

......并且,在阅读结束时:

{
  flock -s 3  # wait for a read lock
  cat <&3     # read contents of the file from FD 3
} 3<text.txt  # all of this with text.txt open to FD 3

您会发现与之前尝试的内容存在一些差异:

  • 用于获取锁的文件描述符是追加模式(写到结尾时),或者是读取模式(读取时),因此您不能覆盖文件你甚至可以抓住锁。
  • 我们正在运行read命令(再次,它是一个shell内置,因此只能由shell直接运行)直接由shell运行而不是告诉flock命令通过execve系统调用来调用它(这也是不可能的)。