5

我们定期将交互式信息亭 CPU 部署到远程物理站点,我开发了一个内容更新器应用程序,该应用程序在每个信息亭(Windows 7 Pro)和托管 CMS(在 linode.com 上运行的虚拟化 Ubuntu 服务器)之间执行媒体资产的夜间同步. 内容更新程序是用 C#/.NET 编写的,它使用 Process.Start() 生成一个子 Unison 进程。Unison 配置为使用私钥通过 SSH 连接到远程服务器。

我们遇到的问题是,当作为 ContentUpdater.exe 的子进程生成时,Unison 通常会在传输过程中停止与远程服务器的通信并无限期挂起。没有简单的复制 - 有时它会起作用,但通常它会挂起。在较大的更新(400MB+)上似乎更脆弱,但这比其他任何事情都更具推测性。当它挂起时,客户端(Windows 7)上的 Unison 进程仍显示 25% 的 CPU 利用率,服务器也显示 Unison 进程也在运行——只是没有网络活动。我知道它正在连接,因为它总是启动该过程并在传输过程中进入,但它永远不会在同一个地方挂起两次。我正在运行 Unison-2.40.63.exe 的原生 Windows 二进制版本,

Windows 上的 Unison 命令行如下所示:

Unison-2.40.63.exe -contactquietly -silent -batch -sshcmd "C:\KioskManagement\Apps\ssh2plink.bat" -sshargs "-p 22 -i C:\cygwin\home\someuser\.ssh\contentupdater-rsync-key.ppk" -ignore "Path {innovations,todaytomorrow,scale,mooreslaw,brilliantminds,askafab}" ssh://cmsuser@server//home/cms/base-preview/webapps/ROOT/applications C:\kioskdir\temp\applications -force ssh://cmsuser@server//home/cms/base-preview/webapps/ROOT/applications

作为记录,我最初编写内容更新程序以使用 rsync(通过 Windows 上的 cygwin),但遇到了同样的问题。为了查看 ssh 传输是否是问题的一部分,我尝试在服务器模式 (rsyncd) 下使用 rsync,但挂起继续抬头。

在这一点上,我彻底被难住了。该问题也在其他服务器上重现,所以我认为它在 Windows 方面。我也倾向于相信这个问题只发生在从另一个进程内部的 Process.Start() 调用 Unison/rsync 时(更新:我只是在从命令行运行时让它重现) - 它似乎没有直接从命令行运行时失败。Unison/rsync 也永远不会出错,因此没有要检查的日志文件(除非有人知道我可以检查的远程服务器上的某种服务器端跟踪或日志文件——完全披露:我是 FreeBSD 极客,并且知道关于 Ubuntu 的宝贵信息)。

提前感谢您提供任何和所有见解/想法/解决方案!

最好的

4

3 回答 3

7

我有这个问题。我花了几天时间解决它。结束添加 -halfduplex 解决了我的问题。

如文档中所述:

halfduplex 当此标志设置为 true 时,Unison 网络通信被强制为半双工(客户端和服务器永远不会同时发送数据)。如果您的网络链接不稳定,这可能会有所帮助。由于 Unison 当前实现的限制可能导致死锁,因此在与 Windows 机器同步时,通信始终是半双工的。

就我而言,我在 Windows/OSX 之间进行同步。

于 2012-07-31T05:12:23.310 回答
4

我确认“halfduplex = true”设置解决了我的悬挂问题。我将 Win7 和 OSX“客户端”和 Linux 服务器设置为中央同步点。所有客户端与服务器同步。

当我将 Mac 客户端介绍给图片时,问题就开始了,从那时起,两个方向都开始发生更新。在 Unison 配置文件中设置“halfduplex = true”解决了我的问题。

奇怪的是,Unison 在两个 Win7 客户端和 Linux 服务器之间同步了一个小得多的目录,但在这种情况下文件要小得多。

于 2013-02-19T01:12:38.277 回答
1

只是插话;我在两台 Windows 7 计算机之间使用 rsync/cygwin 时遇到了同样的问题。网上较早的讨论表明该问题仅影响 ssh 连接,但 rsync 守护程序方法对我来说失败了。有消息假装应该从取消设置 HAVE_SOCKETPAIR 的源重新编译 rsync,据说这会使 rsync/ssh 工作。我还没来得及尝试。

于 2012-06-08T06:28:30.860 回答