2013-05-06 31 views
0

我有一些工作需要在50多台服务器上完成。第一步是将一些源代码的更新版本签出到共享目录中(假设所有共享驱动器都已安装)。其次是在每台服务器上执行一些工作。脚本在50台服务器上运行。我如何确保只有一个人执行特定的步骤?

我宁愿让这两个脚本在每台服务器上运行。所有50多台服务器都是从一张磁盘映像中克隆出来的,因此我无法定制其中的任何一台服务器。

当50个服务器运行第一个脚本时,我只想要第一个尝试运行它以实际运行它的脚本。其他我想简单地退出。实际运行脚本的服务器应该更新共享目录,然后退出。之后,第二个脚本将运行并根据第一台服务器获取的更新代码在所有服务器上执行该工作。

这样做的最好方法是什么?我能否可靠地让第一个脚本在一台服务器上运行,并创建一个文件或某种可以让其他服务器远离的“信号”或“锁定”?

使这个更复杂的是,我正在考虑让脚本从每个服务器上的相同cron文件运行 - 这意味着所有脚本可以尝试同时运行它,假设它们的所有时钟都设置相同。

我希望这些将从bash脚本运行。这是否有意义作为一种方法?

+3

serverfault.com的好问题。 – pilcrow 2013-05-06 17:43:02

+0

你想让它们按特定顺序运行吗? – 2013-05-06 18:01:56

+0

@AdrianFrühwirth50+服务器运行第二个脚本的顺序无关紧要。他们将在自己的文件系统上运行它,不会互相干扰。 – 2013-05-06 18:10:18

回答

2

在大多数环境中,创建目录是一个原子操作,可以用作锁。

假设你已经到/ mnt /共同安装在所有服务器上,你可以在你的脚本#1使用这样的功能:

mkdir -p /mnt/common/script_1.lock || exit 1 
... do your work ... 
rmdir /mnt/common/script_1.lock 

这仅仅是简单的情况;您可能需要将PID存储在某处,并且您需要处理脚本的杀死/崩溃情况(例如通过检查您之前存储的PID是否仍在运行,如果没有,请移除锁定)。

有关这种锁的更多信息可在Wikipedia上找到。

编辑: 另一种类型的原子的锁可以通过使用SQL原子操作(其可以在脚本中被执行,因为大多数SQL实现提供命令行客户机)来获得。

+0

upvote指出mkdir是原子。只有PID文件的问题是锁定目录必须位于nfs共享驱动器上,并且该文件可能由rmote服务器创建 - 这意味着PIC不会在本地存在。另外,即使在NFS挂载时也是mkdir原子吗? – 2013-05-06 18:54:11

+0

@KevinBedell从我记得它取决于实施/ NFS版本,所以不要认为它是原子与NFS(有人请为我的指控提供适当的来源)。 – 2013-05-06 19:06:27

+0

NFS RFC(http://www.faqs.org/rfcs/rfc1094.html)仅将“写入文件”和“重命名文件”指定为原子操作。然而,即使如此,当多个客户端尝试将文件“A”重命名为“B”时(在某些情况下,NFS可能向多个客户端报告成功),通过重命名操作无法知道哪个客户端成功)。 @KevinBedell:关于远程PID的好处。 – 2013-05-06 19:47:32

相关问题