通过 Azure Release Pipeline 上的远程会话启动的进程在超时后终止
Process started via remote session on Azure Release Pipeline killed after timeout
本主题涉及 2 台机器:BuildMachine 和 TargetMachine(我在下面定义它们)。
我在私有实例上使用 Azure devops。
在发布管道中,我在 TargetMachine 上安装了一个软件。
为此,发布管道:
- 由自托管代理执行。 (Agent.Version: 2.153.1) 在 BuildMachin
上
- 在 TargetMachine 上上传 powershell 脚本
- 通过以下任务在 TargetMachine 上运行远程 powershell 会话:
powershell 脚本:
- stops 目标 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
即使我将超时值乘以 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 在发布管道完成后仍然存在。太棒了!
本主题涉及 2 台机器:BuildMachine 和 TargetMachine(我在下面定义它们)。
我在私有实例上使用 Azure devops。 在发布管道中,我在 TargetMachine 上安装了一个软件。 为此,发布管道:
- 由自托管代理执行。 (Agent.Version: 2.153.1) 在 BuildMachin 上
- 在 TargetMachine 上上传 powershell 脚本
- 通过以下任务在 TargetMachine 上运行远程 powershell 会话:
powershell 脚本:
- stops 目标 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
即使我将超时值乘以 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 在发布管道完成后仍然存在。太棒了!