如何明确阻止并行执行?

时间:2013-10-19 02:17:16

标签: algorithm shell synchronization locking

防止bash(或其他)脚本并行执行的常用方法是在启动时创建一个锁定目录,在完成时删除它,并在启动时检查它。但是,可能会出现脚本被异常终止或终止的情况,从而使锁永久化。

解决这个问题的方法是设置一个阈值,任何锁都被认为是陈旧的,如果很久以前创建的话应该被忽略。然而,我的bash脚本再次调用其他程序,并且可能会被执行一段时间(并且很难分成多个小作品),这使得这种方法不可用......

有没有办法解决这个问题?或者还有另一种方法可以锁定并行执行的脚本吗?

2 个答案:

答案 0 :(得分:2)

除了锁定目录之外,您还可以保存持有锁定的实例的进程ID。如果另一个实例发现自己被阻止,它可以检查该进程ID以查看它是否仍在运行,如果没有,则删除锁定目录和PID记录,然后 尝试重新获取锁定。

编辑说明:使用文件系统的底层序列化属性来实现更高级别的同步是一种常见的方法 - 非常适合快速和肮脏的解决方案,或者如果您绝对必须在shell脚本中完成整个事情。如果您需要更加防弹的东西,TCP / IP可能会提供一种不那么脆弱,更便携的方法。您可以用C语言(或几乎任何其他语言)编写轻量级TCP / IP服务器:它只是在某个端口上侦听应用程序启动请求(单线程,一次一个连接,让TCP层解决所有竞争条件),同时监控正在进行的工作,以确定何时接受新请求。

答案 1 :(得分:0)

我的第一个想法是编写足够的C来使用Linux调用,例如flock(),它们会在进程死亡时自动释放。为了刷新我的记忆,我在http://linux.die.net/man/1/flock上找到了关于“flock - 从shell脚本管理锁定”的信息 - 如果你有权访问它,我会帮助你。如果没有,那么类似的东西可能相当容易实现。