不,这与密码保护您的文件无关。
当多个进程处理同一个文件时,您可能不会得到有意的输出,因为没有定义进程如何处理同一个文件的顺序!
文件锁定是一种解决方案,您可以通过它确保通过定义顺序以安全的方式处理读取/写入文件。
这听起来可能太复杂了,但这很好。 因此,在接近解决方案之前,让我先阐明问题。
为什么需要文件锁定
这个问题类似于竞争条件,多个进程同时修改相同的数据,结果严格取决于进程的顺序。
假设有两个过程 一个 和 乙 它们正在处理名为 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. 建议锁定
建议锁定系统不会强制强制,并且仅在两个进程都参与锁定时才会起作用。
为了 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
非合作过程的行为
为了这 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 来完成合适的任务。
如果您有任何疑问,请在评论中告诉我。