下面的 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会意外死亡。
我需要添加不同或更多的-SessionOption
s 吗?
有没有办法找出 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
这是基于以下-IdleTimeoutSec
Microsoft 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(零)表示无超时;操作将无限期继续。