我的问题:
每天晚上,我的crontab都会在CentOS 6.5下使用PBS的超级计算机上进行几次夜间测试。启动时,作业在队列中等待。当调度程序允许运行时,我的工作就开始了。它比调度程序同时启动所有作业(即使我的crontab在不同时刻启动它们)也很常见。
我无法修改作业的主要部分(但我之前可以添加内容)。每个作业都以更新常见的SVN存储库开始。但是,当作业同时启动时,由于同一存储库上的并发更新,我会出错。我想避免这种情况。
我的期望:
由调度程序启动时,作业可能会在启动前等待几秒钟。解决方案可以在启动之前等待一段时间,但是随着我并行执行的测试次数,具有相同随机时间的风险会快速增长。如果我通过选择一个大的随机数来降低这种风险,我必须等待太长时间(锁定超级计算机上未使用的资源)。
我认为可以以多线程安全的方式存储“我将立即启动,其他人必须等待1分钟的每个作业的信息,但我不能我知道怎么做。我想象的是一种互斥体,但只引起延迟而不是等待结束的锁定。
首选没有MPI的解决方案。
当然,我对其他解决方案持开放态度。欢迎任何帮助。
答案 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 {}