我们定期将交互式信息亭 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 的宝贵信息)。
提前感谢您提供任何和所有见解/想法/解决方案!
最好的