系统相关
首页 > 系统相关> > linux-同步四个shell脚本以在unix中一个接一个地运行

linux-同步四个shell脚本以在unix中一个接一个地运行

作者:互联网

我有4个Shell脚本来生成一个文件(比如说param.txt),该文件将由另一个工具(informatica)使用,并且随着该工具的处理完成,它将删除param.txt.

目的是可以在不同时间调用所有四个脚本,比如说12:10 am,12:13 am,12:16 am,12:17 am.第一个脚本在上午12:10运行,并创建param.txt并触发使用param.txt的informatica进程. Informatica流程又需要5-10分钟才能完成,然后删除param.txt.第2个脚本在上午12:13调用并等待param.txt的不可用,并且随着informatica进程将其删除,脚本2创建了新的param.txt并再次触发相同的informatica.另外2个脚本也是如此.

我正在所有4个shell脚本中使用直到和睡眠命令来检查param.txt的不可用性,如下所示:

until [ ! -f "$paramfile" ]
do
    Sleep 10
done
<create param.txt file>

这里的问题是,有时当所有4个脚本开始时,第一个成功并生成param.txt(因为之前没有param.txt),而其他则等待,但是当informatica进程完成并删除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立即失败(如果无法获取该锁),或者在超时后失败(例如,打印“仍在尝试获取该锁”并重新启动).

根据您的用例,您还可以将锁锁定在“ informatica”二进制文件上(在这种情况下,请确保使用200<来打开文件以供读取而不是(过度)写入)

标签:bash,linux,shell,unix,informatica
来源: https://codeday.me/bug/20191009/1880724.html