22

自造科研远程办公工具:代码同步工具sync-go

 4 years ago
source link: https://studygolang.com/articles/26601
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

为了提高自己远程办公的效率,花了不到一天的时间,开发了一个代码同步工具,来同步多个远程服务器之间的代码。

地址: github.com/nladuo/sync…

针对场景

最近由于肺炎疫情大家都在远程办公,我平时的开发工具其实就是 终端 + PyCharm

终端连接服务器运行命令,然后通过PyCharm的同步工具把代码实时的上传到服务器上,大概就是这样的:

miIrEnI.png!web

然而,服务器都是内网的,在家连到服务器上就需要通过配置代理,如果不在实验室,那么如果我连接到 服务器1 ,那就要多经历2-3次ssh。比如说termnial的话我就要多用两次ssh。

NrYB3e6.png!web

不过对于termnial的话,我可以在自己的云服务器上开一个tmux,这样其实和在实验室操作没有区别。

但是对于代码编辑,因为我个人还是不习惯用vim,所以如果用PyCharm,那么我就要多两次scp,这显然不是我想要的。

为什么要造轮子

翻阅github,我找到了一款这样的工具: github.com/serkanyerse…

numyQjY.gif

但这款工具经过我的使用我发现这其实是一款本地工具,并不适用于这种网络延迟高的场景,如果在我这种场景使用,我发现上传的大部分文件的大小都是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)
}
复制代码

像上面这款工具,可能只接收到一个文件创建信号,就去创建了个新的文件,但其实后面还跟着一个写操作。如果网络速度还可以,没到这个软件的最短响应时间,这个写操作可能就会被忽视掉。

所以相对于本地到远程服务器的同步工具,在远程服务器之间的同步工具我增加了以下两点:

    1. 增加一些延迟,防止文件多次被写入。
    1. 对每一次的文件修改,如果文件大小大于一定程度(比如说20KB),需要不断判断文件是否正在被写入,需要等待文件被写入完成再上传。

使用方法

下载安装

这里因为我使用的是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位的服务器现在也应该很少了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK