调用远程Powershell 2.0时MSDeploy挂起

时间:2017-04-13 14:42:59

标签: powershell msdeploy

我从构建服务器调用远程PowerShell脚本。问题是当远程脚本运行超过一分钟时,MSDeploy将在完成时挂起。

MSDeploy的输出如下所示:

Info: Sleeping for a minute...
Info: Done sleeping!
Info: The process 'C:\Windows\system32\cmd.exe' (command line '') exited with code '0x0'.

远程进程显然已完成,但如果运行时间超过一分钟,MSDeploy将无法识别它。我们正在运行的MSDeploy命令如下所示:

"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:runCommand="powershell.exe -File D:\test\command.ps1 < NUL",waitInterval=2147483647,successReturnCodes=0;2 -dest:auto,ComputerName='https://someurl.com',AuthType=Basic,UserName='someusername',Password='somepassword' -allowUntrusted -useCheckSum -Verbose -Debug

请注意我在NUL中如何将流程包含在流程中。这是为了重定向远程PowerShell进程的STDIN,因为当STDIN被重定向时,它显然可以远程挂起。必须手动关闭。

我在stackoverflow上看过很多帖子,暗示这会解决问题。我还能够将< NUL修复程序用于其他环境。

我也看过帖子而不是建议设置标志-InputFormant None,但这也不起作用。

我们说我有2台服务器 - Build Server ARemote Server A。无论我应用什么修复程序,Build Server A上的MSDeploy即使在Remote Server A运行其Powershell脚本并宣布其返回代码时也会挂起。

假设我还有2台服务器 - Build Server BRemote Server B。我已应用的修补程序在这些服务器上运行,而MSDeploy 不会挂起。

两种环境(A和B)都使用Powershell 2.0和MSDeploy版本7.1.1955.0。

输出中存在一个区别我注意到:当使用-Verbose-Debug标志运行这两个进程时,Build Server A会吐出:

  

信息:流程&#39; C:\ Windows \ system32 \ cmd.exe&#39; (命令行&#39;&#39;)退出代码&#39; 0x0&#39;。

构建服务器B吐出:

  

信息:流程&#39; C:\ Windows \ system32 \ cmd.exe&#39; (命令行&#39;&#39;)退出代码&#39; 0x0&#39;。

     

详细:同步在1次传递中完成。

构建服务器B(不挂起)在其详细输出中提及它已成功同步。构建服务器A没有。

很遗憾,我们无法及时升级PowerShell或MSDeploy。有没有人有任何见解?

1 个答案:

答案 0 :(得分:0)

我们发现了问题所在。

显然,MSDeploy在调用远程脚本时使用多个连接。我们的网络超时并且正在终止负责恢复返回状态的连接。这是因为只有在远程脚本完成后才会使用返回状态的连接。发回任何东西花了太长时间。 STDOUT的连接没有受到影响,因为它发回的数据包就像一个健康的连接。

修复此问题就像增加网络设置中的超时时间一样简单。我无法向你解释这是多么令人沮丧。这是一个很好的一周半工作。希望这有助于将来的某个人。