我需要在50多台服务器上完成一些工作。第一步是将某些源代码的更新版本签出到共享目录中(假设所有源代码都已挂载)。第二个是在每个服务器上执行一些工作。
我更希望在每台服务器上运行这两个脚本。所有50多台服务器都是从单个磁盘映像中克隆出来的,而且我自己定制任何服务器都不实用。
当50个服务器运行第一个脚本时,我只想要第一个尝试运行它的实际运行它。其他我想简单退出。实际运行脚本的服务器应该更新共享目录,然后退出。然后,稍后,第二个脚本将运行并根据第一个服务器获取的更新代码在所有服务器上执行工作。
最好的方法是什么?我可以可靠地在一台服务器上运行第一个脚本,并创建一个文件或某种类似“信号量”或某种“锁定”的东西,以阻止其他服务器离开吗?
让这更复杂的是,我正在考虑让脚本从每个服务器上的相同cron文件运行 - 这意味着所有脚本都可以尝试同时运行它,假设它们的所有时钟都设置相同。 / p>
我希望这些将从bash脚本运行。这是一种方法吗?
答案 0 :(得分: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实现提供命令行客户端)来获得另一种类型的原子锁。