远程 Powershell 会话随机终止

远程 Powershell 会话随机终止

下面的 Powershell 代码是我启动远程的方式PSSession

$compName = "server1"

$jobname = "admin_test"

$cred = Get-Credential -UserName "DOMAIN\$env:username" -Message "DOMAIN\$env:username password"

$s_opt = New-PSSessionOption -IdleTimeout -1

$s1 = New-PSSession -ComputerName $compName -Name $jobname -SessionOption $s_opt -Credential $cred

这在大多数情况下都很有效,我们能够$s1 | Enter-PSSession运行命令,或者使用Invoke-Command -Session $s1 -ScriptBlock {some code}。当我们运行可能需要几个小时才能完成的特定作业(通常是python或java)时,有时PSSession会意外死亡。

我需要添加不同或更多的-SessionOptions 吗?

有没有办法找出 PSSession 死亡的原因?

编辑

以下是输出New-PSSessionOption

PS C:\> New-PSSessionOption

MaximumConnectionRedirectionCount : 5
NoCompression                     : False
NoMachineProfile                  : False
ProxyAccessType                   : None
ProxyAuthentication               : Negotiate
ProxyCredential                   :
SkipCACheck                       : False
SkipCNCheck                       : False
SkipRevocationCheck               : False
OperationTimeout                  : 00:03:00
NoEncryption                      : False
UseUTF16                          : False
IncludePortInSPN                  : False
OutputBufferingMode               : None
MaxConnectionRetryCount           : 0
Culture                           :
UICulture                         :
MaximumReceivedDataSizePerCommand :
MaximumReceivedObjectSize         :
ApplicationArguments              :
OpenTimeout                       : 00:03:00
CancelTimeout                     : 00:01:00
IdleTimeout                       : -00:00:00.0010000

编辑2

我在例程中添加了下面的代码来启动PSSession,但PSSession大约 2 小时后仍然无缘无故停止。

## -IdleTimeoutSec in sec/min * min/hr * hrs/day * days
Disconnect-PSSession -Session $s1 -IdleTimeoutSec 60*60*24*3

这是基于以下-IdleTimeoutSecMicrosoft Powershell 文档中可选参数的描述断开连接-PSSession

在 MS 文档中示例 3 的第九条命令中也很好地解释了 Powershell 命令Connect-PSSession 例子摘录如下。

# The ninth command disconnects from the session in the $s variable.The administrator closes PowerShell and closes the computer. She can reconnect to the session on the next day and check the script status from her work computer.
PS C:\> Disconnect-PSSession -Session $s -OutputBufferingMode Drop -IdleTimeoutSec 60*60*15

一个疯狂的事情是,上面的命令给出了以下错误,这要么是 MS 文档中的错误,要么与不同的 Powershell 版本有关:

Disconnect-PSSession : Cannot bind parameter 'IdleTimeoutSec'. Cannot convert value "60*60*24*3" to
type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:76
+ ... sion -Session $x -IdleTimeoutSec 60*60*24*3
+                                      ~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Disconnect-PSSession], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.Disconnect
   PSSessionCommand

但是,当传递的整数值-IdleTimeoutSec转换为字符串时,以下命令可以正常工作。

PS C:> Disconnect-PSSession -Session $s1 -IdleTimeoutSec "259200"

 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  5 admin_test      Server1         RemoteMachine   Disconnected  Microsoft.PowerShell          None

答案1

您可能会遇到IdleTimeout 您所使用的另一个默认超时参数。

运行不带参数的命令New-PSSessionOption(如果您希望我们查看,请在您的帖子中包含输出)。特别注意OperationTimeout

来自文档 新PSSessionOption

-操作超时

确定会话中任何操作可以运行的最大时间。间隔到期后,操作将失败。输入一个以毫秒为单位的值。

默认值为 180000(3 分钟)。值为 0(零)表示无超时;操作将无限期继续。

相关内容