爲了提升本身遠程辦公的效率,花了不到一天的時間,開發了一個代碼同步工具,來同步多個遠程服務器之間的代碼。linux
地址:github.com/nladuo/sync…git
最近因爲肺炎疫情你們都在遠程辦公,我平時的開發工具其實就是終端
+PyCharm
。github
終端鏈接服務器運行命令,而後經過PyCharm的同步工具把代碼實時的上傳到服務器上,大概就是這樣的:vim
然而,服務器都是內網的,在家連到服務器上就須要經過配置代理,若是不在實驗室,那麼若是我鏈接到服務器1
,那就要多經歷2-3次ssh。好比說termnial的話我就要多用兩次ssh。bash
不過對於termnial的話,我能夠在本身的雲服務器上開一個tmux,這樣其實和在實驗室操做沒有區別。服務器
可是對於代碼編輯,由於我我的仍是不習慣用vim,因此若是用PyCharm,那麼我就要多兩次scp,這顯然不是我想要的。網絡
翻閱github,我找到了一款這樣的工具:github.com/serkanyerse…看起來比較知足個人需求,它的效果以下:ssh
但這款工具通過個人使用我發現這實際上是一款本地工具,並不適用於這種網絡延遲高的場景,若是在我這種場景使用,我發現上傳的大部分文件的大小都是0。工具
由於在網絡中傳輸一個1M的文件,可能都要幾秒鐘,因此在這個幾秒鐘內,會一直觸發文件被寫這個事件。因此可能就會不停的上傳。開發工具
另外對於網絡文件的傳輸,首先要建立一個空文件,而後再對空文件去寫,這兩個時間間隔很短。
// create destination file
dstFile, err := sftpClient.Create(remotepath)
if err != nil {
log.Fatal(err)
}
defer dstFile.Close()
// create source file
srcFile, err := os.Open(localpath)
if err != nil {
log.Fatal(err)
}
// copy source file to destination file
_, err = io.Copy(dstFile, srcFile)
if err != nil {
log.Fatal(err)
}
複製代碼
像上面這款工具,可能只接收到一個文件建立信號,就去建立了個新的文件,但其實後面還跟着一個寫操做。若是網絡速度還能夠,沒到這個軟件的最短響應時間,這個寫操做可能就會被忽視掉。
因此相對於本地到遠程服務器的同步工具,在遠程服務器之間的同步工具我增長了如下兩點:
這裏由於我使用的是go語言,直接下載編譯好的結果便可。而後加到path裏面。
wget https://github.com/nladuo/sync-go/releases/download/1.0/sync-go
chmod +x sync-go
mv sync-go /usr/local/bin/
複製代碼
這裏只提供linux-64位的編譯結果,由於這個確定是在linux之間用的,32位的服務器如今也應該不多了。