0

我有一些工作需要在 50 多台服务器上完成。第一步是将某些源代码的更新版本检出到共享目录中(假设都安装了共享驱动器)。第二个是在每台服务器上执行一些工作。

我希望这两个脚本在每台服务器上运行。所有 50 多台服务器都是从一个磁盘映像中克隆出来的,我无法自定义其中的任何一个。

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

最好的方法是什么?我可以可靠地让第一个脚本在一个服务器上运行并创建一个文件或充当某种“信号量”或某种“锁”的东西,从而使其他服务器远离吗?

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

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

4

1 回答 1

2

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

假设您在所有服务器上都安装了 /mnt/common,您可以在脚本 #1 中使用这样的函数:

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

这只是简单的情况;您可能需要将您的 PID 存储在某个地方,并且您需要处理脚本的终止/崩溃,这些脚本会留下锁(例如,通过检查您之前存储的 PID 是否仍在运行,如果没有,请移除锁)。

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

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

于 2013-05-06T18:40:11.663 回答