我花了一天的大部分时间寻找这个问题的解决方案,我想我已接近边缘......我需要在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”,..)。
答案 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
系统调用来调用它(这也是不可能的)。