首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步四个shell脚本,以便在unix中一个接一个地运行

同步四个shell脚本,以便在unix中一个接一个地运行
EN

Stack Overflow用户
提问于 2017-09-13 15:18:06
回答 3查看 701关注 0票数 1

我有4个shell脚本来生成另一个工具(Informatica)使用的文件(比方说param.txt),当这个工具完成处理时,它会删除param.txt。

这里的意图是所有四个脚本都可以在不同的时间调用,比如12: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的不可用性,如下所示:

代码语言:javascript
复制
until [ ! -f "$paramfile" ]
do
    Sleep 10
done
<create param.txt file>

这里的问题是,有时当所有4个脚本开始时,第一个脚本成功并生成param.txt (因为以前没有param.txt )和其他等待,但是当informatica进程完成并删除param.txt时,剩下的3个或其中2个脚本同时检查不可用性,其中一个脚本创建它,但全部成功。我检查了四个脚本之间不同的睡眠间隔组合,但是这种情况几乎每次都会发生。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-13 15:29:36

你正经历着一种经典的种族状态。要解决这个问题,您需要在4个脚本之间共享一个“锁”(或类似的锁)。

有几种方法可以实现这一点。在bash中这样做的一种方法是使用flock命令,并使用一个商定的文件名作为锁。羊群手册页有一些类似于这样的用法示例:

代码语言:javascript
复制
(
    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<,以打开文件以读取而不是(重写))

票数 2
EN

Stack Overflow用户

发布于 2017-09-13 20:14:56

您可以使用GNU并行作为计数信号量或互斥量,方法是以sem而不是parallel的形式调用它。向下滚动到Mutex on 此页

所以,你可以用:

代码语言:javascript
复制
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运行作业。如果您从一个终端开始所有作业,这是不必要的。

票数 1
EN

Stack Overflow用户

发布于 2018-05-29 14:27:48

谢谢你的宝贵建议。它确实帮助我从另一个维度思考。但是,我没有提到我使用的是Solaris UNIX,在这里我找不到相当于flock或类似功能的函数。我本可以要求团队安装一个实用程序,但同时我找到了解决这个问题的方法。

我读到了mkdir函数本质上是原子的,其中作为“触摸”命令创建文件不是(仍然没有完整的解释它是如何工作的)。这意味着一次只有一个脚本可以创建/删除目录'lockdir‘,而其他3个必须等待。

代码语言:javascript
复制
while true;
do 
if mkdir "$lockdir"; then
   < create param file >

break;
fi
    Sleep 30
done
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46201207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档