我从构建服务器调用远程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 A
和Remote Server A
。无论我应用什么修复程序,Build Server A
上的MSDeploy即使在Remote Server A
运行其Powershell脚本并宣布其返回代码时也会挂起。
假设我还有2台服务器 - Build Server B
和Remote 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。有没有人有任何见解?
答案 0 :(得分:0)
我们发现了问题所在。
显然,MSDeploy在调用远程脚本时使用多个连接。我们的网络超时并且正在终止负责恢复返回状态的连接。这是因为只有在远程脚本完成后才会使用返回状态的连接。发回任何东西花了太长时间。 STDOUT的连接没有受到影响,因为它发回的数据包就像一个健康的连接。
修复此问题就像增加网络设置中的超时时间一样简单。我无法向你解释这是多么令人沮丧。这是一个很好的一周半工作。希望这有助于将来的某个人。