2011-11-04 36 views
1

我有兩臺機器都運行一個進程。機器A上的shell進程將scp東西加到B上,而B上的java進程將使用這些文件。這兩個進程都作爲crontab任務運行。跨機器實現這種同步的好設計是什麼?

如何實現同步/原子性等?如何表示整個文件已被寫入。

等B中過程中始終可以訪問最新的和完整的文件,處理程序不走陳舊..

回答

2

假設你正在使用帶原子移動的文件系統,你可以這樣做。或者使用符號鏈接。

A將文件複製到B上的臨時位置。上傳完成後,它通過移動或符號鏈接將文件重定位到預期位置。 B只能看到完全上傳的文件。

如果您的A上的進程無法通過SSH連接到B來完成最後一步,那麼可以添加另一個零字節的標記文件來指示上載完成。

上傳FOO.txt,當上傳完成時,它創建FOO.txt.done文件。 B然後掃描目錄中的* .done文件,並使用關聯的數據文件。當然加上清理。

+0

A上的進程可以在B機器上執行這些原子移動嗎? – xyz

+0

更新說明您可以通過SSH進行移動,或使用標記文件來指示完成。 – ptomli

+0

如果你記得它的頭頂,那麼使用ssh進行移動的命令是什麼? – xyz

0

一個quick'n'dirty變通/對問題的解決可以通過使用用戶解決控制,在複製文件時(使用來自A的SCP)設置所有權(以及適當的chmod),完成後更改所有權/權限,以便B上的進程能夠訪問文件。

0

我可以推薦幾個黑客猜測。您可以: -

  1. 創建的文件寫入開始時的臨時文件(如鎖定文件),它的存在意味着,正在傳輸的文件被寫入和刪除臨時文件,一旦寫做完了。 或
  2. 刪除消費者進程的crontab並讓scp進程發送一個信號(JMS/unicast)。 java進程可能只是一個隊列/套接字上的監聽器,或者在接收到單播時被調用。