2013-05-06 63 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

相關問題