bash:如何等待一段时间以避免同时运行脚本?

时间:2017-11-13 11:11:24

标签: bash svn concurrency mutex pbs

我的问题:

每天晚上,我的crontab都会在CentOS 6.5下使用PBS的超级计算机上进行几次夜间测试。启动时,作业在队列中等待。当调度程序允许运行时,我的工作就开始了。它比调度程序同时启动所有作业(即使我的crontab在不同时刻启动它们)也很常见。

我无法修改作业的主要部分(但我之前可以添加内容)。每个作业都以更新常见的SVN存储库开始。但是,当作业同时启动时,由于同一存储库上的并发更新,我会出错。我想避免这种情况。

我的期望:

由调度程序启动时,作业可能会在启动前等待几秒钟。解决方案可以在启动之前等待一段时间,但是随着我并行执行的测试次数,具有相同随机时间的风险会快速增长。如果我通过选择一个大的随机数来降低这种风险,我必须等待太长时间(锁定超级计算机上未使用的资源)。

我认为可以以多线程安全的方式存储“我将立即启动,其他人必须等待1分钟的每个作业的信息,但我不能我知道怎么做。我想象的是一种互斥体,但只引起延迟而不是等待结束的锁定。

首选没有MPI的解决方案。

当然,我对其他解决方案持开放态度。欢迎任何帮助。

2 个答案:

答案 0 :(得分:1)

从包装器调用脚本,该包装器首先尝试获取锁定文件的独占锁定。例如

{
    flock -s 200
    # your script/code here
} 200> /var/lock/myscript

锁定文件的名称并不重要,只要您具有打开它的写入权限即可。当这个包装器运行时,它将首先尝试在/var/lock/myscript上获得独占锁。如果另一个脚本已经有锁,它将阻塞,直到锁变为可用。

请注意,没有任意等待时间;每个脚本将按照他们首次尝试获取锁定的顺序尽快运行。这意味着您也可以同时启动作业;操作系统将管理对锁定和订购的访问。

答案 1 :(得分:0)

以下是使用GNU parallel

的解决方案

首先使用此工具可能看起来有点违反直觉,但如果将一次运行的最大作业数设置为1,则可以模拟按顺序运行多个作业的作业队列,而不会出现任何重叠

您可以使用此示例

观察此命令的预期效果
seq 1 5 | parallel -j1 -k 'echo {}; sleep 1'

-j1将一次运行的最多作业设置为1,而-k保留订单。

要将此应用于原始问题,我们可以创建一个文件,使其包含逐行的脚本文件列表。然后,我们可以将该文件的内容传递给parallel,以使多个脚本按顺序依次运行。

cat file | parallel -j1 -k bash {}