【问题标题】:Process started via remote session on Azure Release Pipeline killed after timeout通过 Azure Release Pipeline 上的远程会话启动的进程在超时后被终止
【发布时间】:2021-03-05 15:47:46
【问题描述】:

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

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

  • 由自托管代理执行。 (Agent.Version: 2.153.1) 在 BuildMachin 上
  • 在 TargetMachine 上上传 powershell 脚本
  • 通过以下任务在 TargetMachine 上运行远程 powershell 会话:

powershell 脚本:

  • 停止目标exe
  • 更新 bin 文件夹
  • 重新启动 exe
  • 退出无需等待 ExitCode,因为应用程序是必须保持活动状态的服务器。 使用以下代码:
    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

即使我将 timeout 乘以 10,targetProcess 也会在 1'20" 后被杀死:

    -SkipCACheck -IdleTimeout 600000 -OperationTimeout 600000 -OutputBufferingMode Block

即使我将 pssession 的参数减少到:

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

    powershell ./release_TAS.ps1

脚本需要 10 秒才能执行。

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

问候

【问题讨论】:

  • 您能告诉我们更多细节吗? 1.您使用的是微软托管代理还是自托管代理? 2. 请您尝试在目标虚拟机上手动运行 Powershell 脚本并检查此问题是否仍然存在? 3.如果可以的话,请尝试在你的vm中安装一个self-agent,然后使用新的self-agent再次运行pipeline,看看是否有同样的问题。
  • 我用你问的细节更新了我的问题

标签: c# azure azure-devops devops azure-pipelines-release-pipeline


【解决方案1】:

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

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

【讨论】:

  • 我用你的评论更新了我的问题,将 30 秒增加到 60 秒 => 相同的问题
  • 你的脚本在本地机器上占用了多少?
  • 您的意思是控制台应用程序是由您的 PS 脚本运行的吗?开火就忘了?它被杀死了?
  • script : 10 seconds yes : ps 脚本启动应用程序,忘记它,并在 1.20 分钟后被杀死。这不是应用程序问题,因为我尝试使用不同的 exe。使用此信息在正文中更新主题。你不能复制吗?
  • 即使我将 timeout 乘以 10,targetProcess 也会在 1'20" 后被杀死
【解决方案2】:

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

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

wsmprovhost.exe 是一个 Windows 远程 Powershell 会话,当您进入远程会话时,您会在服务器上创建一个名为 wsmprovhost.exe 的进程。当您在此远程会话中简单地启动一个进程时,新进程将是一个子进程wsmprovhost.exe 的。

当本地计算机连接到远程计算机时,WS-Management 会建立连接并使用 PowerShell 插件在远程计算机上启动 PowerShell 主机进程 (Wsmprovhost.exe)。

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

要在断开连接的会话中运行命令,请使用 InDisconnectedSession 参数。要在后台作业中运行命令,请使用 AsJob 参数。

我使用 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

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

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

在你看到的上方:

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

在此之后,目标进程:Tas.exe 在发布管道完成后保持活动状态。太棒了!

【讨论】:

  • 事实上,即使使用这种解决方法,进程也会被终止。只是它被推迟到 2 小时后......这真是太愚蠢了!
猜你喜欢
  • 2012-01-30
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
相关资源
最近更新 更多