我有4个Shell脚本来生成一个文件(比如说param.txt),该文件将由另一个工具(@R_988_4045@ica)使用,并且随着该工具的处理完成,它将删除param.txt.
目的是可以在不同时间调用所有四个脚本,比如说12:10 am,12:13 am,12:16 am,12:17 am.第一个脚本在上午12:10运行,并创建param.txt并触发使用param.txt的@R_988_4045@ica进程. @R_988_4045@ica流程又需要5-10分钟才能完成,然后删除param.txt.第2个脚本在上午12:13调用并等待param.txt的不可用,并且随着@R_988_4045@ica进程将其删除,脚本2创建了新的param.txt并再次触发相同的@R_988_4045@ica.另外2个脚本也是如此.
我正在所有4个shell脚本中使用直到和睡眠命令来检查param.txt的不可用性,如下所示:
until [ ! -f "$paramfile" ]
do
Sleep 10
done
<create param.txt file>
这里的问题是,有时当所有4个脚本开始时,第一个成功并生成param.txt(因为之前没有param.txt),而其他则等待,但是当@R_988_4045@ica进程完成并删除param.txt时,剩下的3个脚本或其中的2个他们同时检查不可用性,其中之一创建了不可用性,但一切都成功了.我检查了四个脚本之间不同的睡眠间隔组合,但是这种情况几乎每次都发生.
解决方法:
您正在经历经典的比赛条件.要解决此问题,您需要在4个脚本之间共享一个“锁”(或类似名称).
有几种方法可以实现此目的.在bash中执行此操作的一种方法是使用flock命令,并将约定的文件名用作锁. flock man page具有一些类似于以下的用法示例:
(
flock -x 200 # try to acquire an exclusive lock on the file
# do whatever check you want. You are guaranteed to be the only one
# holding the lock
if [ -f "$paramfile" ]; then
# do something
fi
) 200>/tmp/lock-life-for-all-scripts
# The lock is automatically released when the above block is exited
您也可以要求flock立即失败(如果无法获取该锁),或者在超时后失败(例如,打印“仍在尝试获取该锁”并重新启动).
根据您的用例,您还可以将锁锁定在“ @R_988_4045@ica”二进制文件上(在这种情况下,请确保使用200<来打开文件以供读取而不是(过度)写入)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。