我有一个 shell 脚本,该脚本将由多个实例执行,如果一个实例访问文件并执行某些操作,我如何确保其他实例不会访问同一文件并损坏数据?
我的问题不是关于控制并行执行,而是处理文件锁定或标记机制。
请求一些建议以继续。
答案1
Linux 通常不执行任何锁定(与 Windows 不同)。这有很多优点,但如果您必须锁定文件,您有多种选择。我建议
群:在打开的文件上应用或删除咨询锁。
该实用程序从 shell 脚本内或从命令行管理集群(2)锁。
对于单个命令(或整个脚本),您可以使用
flock --exclusive /var/lock/mylockfile -c command
如果您想在锁定下执行脚本中的更多命令,请使用
#!/bin/bash
....
(
flock --nonblock 200 || exit 1
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
仅当当前没有其他进程持有 on 时,才会执行子flock
shell 内调用之后的所有操作。子 shell 退出后,锁会自动解除。(...)
flock
/var/lock/mylockfile
flock
也可以等到文件锁被删除(这是默认设置)。在这种情况下,请勿使用该--nonblock
选项,flock
如果无法成功获得锁定,则会导致失败。