如何从多个脚本同步(锁定/解锁)访问bash中的文件?

前端之家收集整理的这篇文章主要介绍了如何从多个脚本同步(锁定/解锁)访问bash中的文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@ 我正在编写并行运行的脚本,并从同一个文件中获得他们的输入数据。这些脚本将打开输入文件,读取第一行,存储进行进一步处理,最后从输入文件删除该读取行。

现在的问题是访问文件的多个脚本可能导致两个脚本同时访问输入文件并读取同一行的情况,这会导致正在被处理的行的不可接受的结果两次。

现在一个解决方案是在访问输入文件之前编写一个锁定文件(.lock_input),然后在释放输入文件时擦除它,但这种解决方案在我的情况下并不吸引人,因为有时NFS随机地减慢了网络通信,可能没有可靠的锁定。

另一个解决方案是放置一个进程锁而不是写一个文件,这意味着第一个脚本访问输入文件将启动一个名为lock_input的进程,其他的脚本将ps -elf | grep lock_input。如果它存在于进程列表中,它们将等待。这可能比写入NFS更快,但仍然不完美的解决方案…

所以我的问题是:有没有任何bash命令(或其他脚本解释器)或一个可以使用的服务,它将在线程编程中用于同步的信号量或互斥锁的行为?

谢谢。

小粗略的例子:

假设我们有input_file如下:

Monday
Tuesday
Wednesday
Thursday
Friday
Saturday 
Sunday

治疗脚本:TrScript.sh

#!/bin/bash  
NbLines=$(cat input_file | wc -l)  
while [ ! $NbLines = 0 ]  
do  
  FirstLine=$(head -1 input_file)  
  echo "Hello World today is $FirstLine"  
  RemainingLines=$(expr $NbLines - 1 )  
  tail -n $RemainingLines input_file > tmp  
  mv tmp input_file  
  NbLines=$(cat input_file | wc -l)   
done

主要脚本:

#! /bin/bash  
./TrScript.sh &  
./TrScript.sh &  
./TrScript.sh &  
wait

结果应该是:

Hello World today is Monday  
Hello World today is Tuesday  
Hello World today is Wednesday  
Hello World today is Thursday  
Hello World today is Friday  
Hello World today is Saturday  
Hello World today is Sunday
我一直喜欢procmail工具集的lockfile程序( lockfile manpage的样例搜索结果)(应该在大多数系统上可用,尽管默认情况下可能不安装)。

它旨在锁定通过NFS通常安装的邮件假脱机文件,因此它可以通过NFS正常工作(尽可能多的)。

此外,只要你假设所有的“工人”都在同一台机器上(假设你可以检查PID,当PID最终包装时可能无法正常工作),你可以把你的锁文件放在一些其他,本地,目录(例如/ tmp),同时处理托管在NFS服务器上的文件。只要所有的工作人员使用相同的锁定文件位置(以及锁定文件名到锁定路径名的一对一映射),它将正常工作。

猜你在找的Bash相关文章