2017-09-13 121 views
1

我有4个shell脚本生成一个文件(假设param.txt),这是通过使用其他工具(Informatica的),并作为刀具与加工完成的,它会删除param.txt。同步4个shell脚本运行陆续在UNIX

这里的意图是所有四个剧本,可以在不同的时间被调用可以说,凌晨00:10,上午12时13分,上午12时16分,上午12时17分。第一个脚本在上午12点10分运行,并创建param.txt并触发使用param.txt的informatica流程。 Informatica过程需要5-10分钟才能完成并删除param.txt。第二个脚本在上午12:13调用并等待param.txt不可用,并且由于informatica进程将其删除,脚本2将创建新的param.txt并再次触发相同的informatica。另外两个脚本也是如此。

我使用直到和睡眠命令在所有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个同时检查不可用,并且其中一个创建它,但都成功。我检查了四种脚本之间睡眠间隔的不同组合,但几乎每次都发生这种情况。

+0

看看在每个脚本开始时在'/ var/tmp'中创建一个临时txt文件,并在它结束时将其删除 – Vinny

+0

是否有任何东西阻止informatica进程同时运行,除了它们看起来都是硬编码寻找'params.txt'? – chepner

+0

不,每个脚本运行后param.txt都会更改,并且informatica工作流程将在每次运行中提取已更改的param.txtx。 – singhsaurabh

回答

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<,打开文件进行读取(以上)的写作,而不是)

+0

取决于什么'<创建参数。txt文件>'实际上,你可能可以通过'O_CREAT |'来调用'open()'。 O_EXCL'标志设置。如果文件尚不存在,则open()调用将成功并创建该文件;或者如果文件存在,它将会失败。 – Niobos

+0

感谢您的答案铌。我用你的答案来修改我的脚本。 ( 羊群-x -n 800 \t直到[!-f “$ paramfiletmp”] \t做 \t \t睡眠10 \t做 \t \t $ paramFile> $ paramfiletmp#(此步骤创建param.tx) ) 800>的/ var/TMP/lockforScripts。我不善于编写脚本,无法找出问题。我得到的错误是 - '800'意外。顺便说一句,我正在使用Solaris。 – singhsaurabh

+0

该脚本很难在您的评论中阅读。根据你所得到的错误,你应该仔细检查'800'和'''之间是否没有空格。 – Niobos

0

你可以使用GNU并行作为一个计数信号或互斥,通过调用它作为sem而不是作为parallel。在this page上滚动至Mutex

所以,你可以使用:

sem --id myGlobalId 'create input file; run informatica' 
sem --id myGlobalId 'create input file; run informatica' 
sem --id myGlobalId 'create input file; run informatica' 
sem --id myGlobalId 'create input file; run informatica' 

注意我指定的情况下,全球id您从不同的终端或的cron作业。如果您从一个终端启动所有工作,则这不是必需的。