通过 Azure Release Pipeline 上的远程会话启动的进程在超时后终止

Process started via remote session on Azure Release Pipeline killed after timeout

本主题涉及 2 台机器:BuildMachine 和 TargetMachine(我在下面定义它们)。

我在私有实例上使用 Azure devops。 在发布管道中,我在 TargetMachine 上安装了一个软件。 为此,发布管道:

powershell 脚本:

    Stop-Process -Name "TOTO" -ErrorAction SilentlyContinue
    ......
    Start-Process -FilePath "C:\toto.exe" -WorkingDirectory "C:\" -WindowStyle Maximized
    Write-Output "Process is started"
    Exit 0

发布管道完成成功并且 powershell 任务需要: 35 秒:

BUT 1 分 20 秒后进程被终止。 该进程是一个控制台应用程序,它是一个 TCP 服务器,它应该永远保持活动状态(如果我添加一个带有按钮的 winform 应用程序会出现同样的问题)。

我的 ps 任务的配置如下(60 秒大于当前 powershell 执行时间 35 秒):

    -SkipCACheck -IdleTimeout 60000 -OperationTimeout 60000 -OutputBufferingMode Block

即使我将超时值乘以 10,targetProcess 也会在 1'20" 后终止:

    -SkipCACheck -IdleTimeout 600000 -OperationTimeout 600000 -OutputBufferingMode Block

甚至当我将 pssession 的参数减少到:

在 TargetMachine 的本地命令提示符中,以管理员身份打开,我 运行 相同的脚本没有问题,并且进程没有被终止:

    powershell ./release_TAS.ps1

脚本执行需要 10 秒。

=> 是否有某处设置表明 ps 创建的子进程可以无限期地继续单独存在? 如何通过 azure 发布管道启动进程,并让它执行而不等待退出代码。

此致

您的 Powershell 脚本似乎花费了很多时间。您必须将 IdleTimeout and OperationTimeout 值增加到 实际需要的值

目前,您的 IdleTimeout 是 1 分钟(60000 毫秒),OperationTimeout 是 30 秒(30000 毫秒)。

问题没有解决,但我想我找到了负责人wsmprovhost.exe:

我的 Tas.exe 和 BasicGui.exe 与另一个我没有接触的进程同时被杀死(几毫秒后):'wsmprovhost.exe'

wsmprovhost.exe is a Windows Remote Powershell session,when you enter a remote session ,you create on the server a process called wsmprovhost.exe.When you simply start a process in this remote session,the new process will be a child of wsmprovhost.exe.

When a local computer connects to a remote computer, WS-Management establishes a connection and uses a plug-in for PowerShell to start the PowerShell host process (Wsmprovhost.exe) on the remote computer.

在这个页面上我发现了一个有趣的段落: Powershell params

To run a command in a disconnected session, use the InDisconnectedSession parameter. To run a command in a background job, use the AsJob parameter.

我使用 powershell scipts 从我的本地机器重现了这个问题,它在远程机器上启动目标服务器进程,一旦我的本地脚本停止,目标远程进程就会被杀死:

$username = 'xxx'
$password = 'yyy'
$secpw = ConvertTo-SecureString $password -AsPlainText -Force
$cred  = New-Object Management.Automation.PSCredential ($username, $secpw)
Invoke-Command -FilePath C:\Xoru\DEV\Install\release_TAS.ps1 -ComputerName SCHTROUPHFER -Credential $cred

但是,如果我 运行 使用参数“-InDisconnectedSession”的命令,我的服务器进程不会被终止:

Invoke-Command -FilePath C:\Xoru\DEV\Install\release_TAS.ps1 -ComputerName SCHTROUPHFER -Credential $cred -InDisconnectedSession

问题是 azzure 上的远程电源 shell 任务没有使用 Invoke-Command,而是使用 New-PsSession,它将一个虚拟的 New-PSSessionOption 对象作为可选参数 不要 接受 -InDisconnectedSession 参数,哈哈!.... .a!@#$%^&*()

...zzzoo ze zoluzion..... 在于不使用远程 powershell 脚本,而是在 zeee 构建机器上使用本地 powershell 脚本并要求它在一个远程执行断开连接状态(哈哈)目标机器上的脚本:

上面你看到:

  • 将任务推送到目标机器上 ze zip
  • 在构建机器上复制一个 powershell 脚本在目标机器上执行的任务
  • 在构建机器(执行代理的地方)上执行 powershell 脚本的任务,以远程执行 powershell 脚本 (InstallScript)
  • 的内容

在此之后,目标进程 : Tas.exe 在发布管道完成后仍然存在。太棒了!