我想并行运行多个 Bash shell 脚本。但是,我想避免竞争条件。我可以为此目的使用哪些 Unix 命令真正具有原子性,我该如何使用它们?
通过庆典会后文件,这个问题,这一个它仍然不是很清楚,我哪能执行原子写入(追加)操作在bash文件。我有一个在多个实例中运行的脚本,并且在某些时候必须将数据写入文件:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
Run Code Online (Sandbox Code Playgroud)
如何使所有并发运行的脚本的所有写入操作都原子化(以便来自一个实例的数据不会与来自另一个实例的数据重叠)?
我想知道我们是否在 crontab 中添加了一个作业,例如每 5 分钟运行一次,而该作业实际上并没有在 5 分钟内完成,cron 守护进程是否知道前一个实例已经在运行并跳过下一次运行?或者我必须以某种方式为流程构建逻辑?如何?
如果我有一个 crontab 作业,例如每小时运行一次,但该作业可能需要一个多小时才能完成,下一个作业是否会无法运行?
我计划进行复杂的文件共享设置,并希望确保不会破坏文件锁定。(想在同一数据上使用绑定挂载、nfs、nfs over rdma(InfiniBand 文件共享)和 virtfs(kvm 虚拟机直通文件共享)。)
我刚开始进行健全性检查,只是用一个 nfs 客户端测试 nfs 服务器。两个系统上的最新 Arch,nfs-utils 1.3.2-6,内核 4.1.6-1。
我看到了意想不到的结果。在 nfs 服务器上:
server exports with: /test 192.168.0.0/16(rw,sync,no_subtree_check,
no_root_squash)
client mount shows: 192.168.1.2:/test on /test type nfs4 (rw,noatime,vers=4.2,
rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,port=0,timeo=600,
retrans=2,sec=sys,clientaddr=192.168.1.3,local_lock=none,addr=192.168.1.2)
Run Code Online (Sandbox Code Playgroud)
在 /test 中,我有一个以lockFile
内容命名的脚本:
#!/bin/bash
filename="lockedFile"
exec 200>$filename
flock -n 200 || exit 1
pid=$$
while true; do
echo $pid 1>&200
done
Run Code Online (Sandbox Code Playgroud)
如果我在 nfs 服务器上使用两个终端:
1: ./lockFile
2: ./lockFile
Run Code Online (Sandbox Code Playgroud)
然后,终端 1 迅速用它的 pid 填满一个文件,终端 2 立即退出。一切都在预料之中。
但是,如果我在 nfs 服务器和客户端上分别运行一个终端:
server: ./lockFile
client: ./lockFile
Run Code Online (Sandbox Code Playgroud)
两人开心地奔跑,出乎意料。
在此配置中,我的 …