如何确保一次只有一个实例访问文件夹中的文件?

Wil*_*m R 6 linux shell-script lock open-files files

我有一个 shell 脚本,它将由多个实例执行,如果一个实例访问一个文件并执行一些操作,我如何确保其他实例没有访问同一个文件并破坏数据?

我的问题不是关于控制并行执行,而是处理文件锁定或标记机制。

请求一些建议以继续。

Seb*_*ian 8

Linux 通常不做任何锁定(与 Windows 不同)。这有许多优点,但如果您必须锁定文件,则有多种选择。我建议

flock:在打开的文件上应用或移除咨询锁

此实用程序从 shell 脚本内或从命令行管理 flock(2) 锁。

对于单个命令(或整个脚本),您可以使用

flock --exclusive /var/lock/mylockfile -c command
Run Code Online (Sandbox Code Playgroud)

如果要在锁定下的脚本中执行更多命令,请使用

#!/bin/bash
 .... 

(
flock --nonblock 200 || exit 1
# ... commands executed under lock ...
) 200>/var/lock/mylockfile 
Run Code Online (Sandbox Code Playgroud)

只有当没有其他进程当前持有on 时,才会执行flock子 shell 内部调用之后的所有操作。子shell退出后,锁会自动删除。(...)flock/var/lock/mylockfile

flock也可以等到文件锁定被删除(这是默认设置)。在这种情况下,不要使用该--nonblock选项,flock如果无法获得成功的锁,则会失败。