Linux 中的文件锁定

不,这与密码保护您的文件无关。

当多个进程处理同一个文件时,您可能不会得到有意的输出,因为没有定义进程如何处理同一个文件的顺序!

文件锁定是一种解决方案,您可以通过它确保通过定义顺序以安全的方式处理读取/写入文件。

这听起来可能太复杂了,但这很好。 因此,在接近解决方案之前,让我先阐明问题。

为什么需要文件锁定

这个问题类似于竞争条件,多个进程同时修改相同的数据,结果严格取决于进程的顺序。

假设有两个过程 一个 它们正在处理名为 account.txt 的文件(初始数据为 100),它们的行为如下:

  • A 读取当前值并从初始余额中减去 20
  • B 读取当前值并将余额加 50。

在纸面上,一切看起来都很好,最终的数据应该是 130,但它最终是别的东西。 让我告诉你怎么做:

  • 过程A:读取数据(100)并准备操作。
  • 进程B:读取数据(100)并将当前数据保存到其缓冲区。
  • 过程 A:从 100 中减去 20,得到 80。
  • 过程B:它不知道原始数据已被修改并使用100作为初始值,因此最终结果最终为150(100 + 50)而不是您预期的(130)。

还有文件锁定的实现。 那么让我们来看看Linux中文件锁定的类型。

Linux 中的文件锁定类型

Linux 中有两种类型的文件锁定:

  1. 咨询锁定
  2. 强制锁定

1. 建议锁定

建议锁定系统不会强制强制,并且仅在两个进程都参与锁定时才会起作用。

为了 example,进程 A 获取锁并使用文件启动给定任务。

如果进程 B 在没有获取锁的情况下启动,它可以中断进程 A 正在进行的任务。

所以做咨询锁的条件是保证每个进程都参与锁。

2.强制锁定

强制锁定可以理解为一种强制锁定系统,它不需要进程的任何配合。

强制锁定导致内核监视每次打开、读取和写入,以验证该进程不会违反任何进程。

但是使强制锁定工作需要相对更多的步骤:

  • 使用“-o mand”选项挂载文件。
  • 此外,用户需要关闭组执行位并打开 set-group-ID 以启用强制锁定,因为当您关闭组执行位时,set-group-ID 将没有影响。

如何启用咨询锁定

为此,我将使用flock 命令,它允许用户处理与咨询锁定相关的任务。 而flock命令的语法如下:

flock file_to_lock command

首先,让我们创建一个文件来保存默认值:

touch account.txt

现在,让我们让它保持 100 作为默认值:

echo "100" > account.txt

因此,让我们创建一个简单的脚本来处理流程的逻辑部分:

#!/bin/bash
file="account.txt"
value=$(cat $file)
echo "Read current balance:$value"

#sleep 10 seconds to simulate business calculation
progress=10
while [[ $progress -lt 101 ]]; do
	echo -n -e "33[77DCalculating new balance..$progress%"
	sleep 1
	progress=$((10+progress))
done
echo ""

value=$((value+$1))
echo "Write new balance ($value) back to $file." 
echo $value > "$file"
echo "Done."

现在,让我们创建带有咨询锁定的进程 a.sh:

touch a.sh
nano a.sh

并确保它包含以下内容:

#!/bin/bash
flock --verbose balance.dat ./update_balance.sh '-20'

现在,让我们让它可执行:

chmod +x a.sh

所以让我们来测试一下:

./a.sh 
进程 A 正在运行

非合作过程的行为

为了这 example,我将创建脚本 b.sh 这将是不合作的性质。

touch b.sh
nano b.sh

脚本应包含以下内容:

#----------------------------------------
# non-cooperative way
#----------------------------------------
./update_balance.sh '80'

按照给定的命令使其可执行:

chmod +x b.sh

所以让我们来测试一下:

非合作过程

如您所见,我想要的值应该是 160,但过程 b 搞砸了,给出了 180。

协作过程的行为

在本节中,我将通过一些小的更改来制作流程 ba 合作流程:

#----------------------------------------
# A cooperative way
#----------------------------------------
flock --verbose balance.dat ./update_balance.sh '80'

好戏开场了:

协同进程的咨询文件锁合作过程在行动

如您所见,进程 B 在执行第一个进程时等待,我得到了预期的结果!

如何在 Linux 中检查锁

您可以使用 lslocks 命令检查所有锁。 而且使用非常简单。 一个命令,就是这样:

lslocks
列出linux中的所有锁

它将显示从命令、锁定类型到路径的所有内容。

最后的话

本指南解释了与 Linux 中的锁相关的所有基础知识,并举例说明了如何使用咨询 Linux 来完成合适的任务。

如果您有任何疑问,请在评论中告诉我。