
Приведенный ниже код 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
Также хорошо объяснено в девятой команде Примера 3 документации MS для команды PowershellConnect-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:
-OperationTimeout
Определяет максимальное время, в течение которого может выполняться любая операция в сеансе. По истечении интервала операция завершается неудачей. Введите значение в миллисекундах.
Значение по умолчанию — 180000 (3 минуты). Значение 0 (ноль) означает отсутствие тайм-аута; операция продолжается бесконечно.