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

时间:2017-09-13 15:18:07

标签: linux bash shell unix informatica

我有4个shell脚本来生成一个文件(让他们说param.txt),这是另一个工具(informatica)使用的,当工具完成处理时,它会删除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并再次触发相同的信息。另外两个脚本也是如此。

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

<action android:name="android.intent.action.ACTION_SHUTDOWN" />

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

3 个答案:

答案 0 :(得分: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<,打开文件进行阅读而不是(过)写入

答案 1 :(得分:1)

您可以将 GNU Parallel 用作计数信号量或互斥量,方法是将其调用为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运行作业。如果您从一个终端开始所有作业,则不需要这样做。

答案 2 :(得分:0)

感谢您宝贵的建议。它确实帮助我从其他方面思考。但是我错过了提到我使用的是Solaris UNIX,我找不到相应的flock或类似功能。我可以要求团队安装一个实用程序,但同时我找到了解决此问题的方法。

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

while true;
do 
if mkdir "$lockdir"; then
   < create param file >

break;
fi
    Sleep 30
done