
O código Powershell abaixo é como estou iniciando o controle remoto 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
Isso funciona muito bem na maior parte e podemos $s1 | Enter-PSSession
executar comandos ou usar arquivos Invoke-Command -Session $s1 -ScriptBlock {some code}
. Quando executamos trabalhos específicos (geralmente python ou java) que podem levar muitas horas para serem concluídos, às vezes a PSSession morre inesperadamente.
Preciso adicionar diferentes ou mais -SessionOption
s ?
Existe uma maneira de descobrir por que o PSSession morreu?
Editar
Abaixo está a saída deNew-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
Editar 2
Adicionei o código abaixo à minha rotina para iniciar o PSSession
, porém ele PSSession
ainda para sem motivo após cerca de 2 horas.
## -IdleTimeoutSec in sec/min * min/hr * hrs/day * days
Disconnect-PSSession -Session $s1 -IdleTimeoutSec 60*60*24*3
Isso foi baseado na seguinte descrição do -IdleTimeoutSec
parâmetro opcional nos documentos Powershell da MicrosoftDesconectar-PSSession
Também explicado bem no nono comando do Exemplo 3 dos documentos do MS para o comando PowershellConnect-PSSession
Exemplosextraído abaixo.
# 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
Uma coisa maluca que é um erro nos documentos do MS ou tem a ver com uma versão diferente do Powershell é que o comando acima fornece o seguinte erro:
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
No entanto, o comando a seguir funciona bem quando o valor inteiro passado -IdleTimeoutSec
é convertido em uma string.
PS C:> Disconnect-PSSession -Session $s1 -IdleTimeoutSec "259200"
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
5 admin_test Server1 RemoteMachine Disconnected Microsoft.PowerShell None
Responder1
Você pode estar executando outro parâmetro de tempo limite padrão diferente IdleTimeout
do usado.
Execute o comando New-PSSessionOption
sem parâmetros (inclua a saída em sua postagem se desejar que dêmos uma olhada). Preste atenção especial a OperationTimeout
.
Da documentação para Nova opção PSSession:
-OperaçãoTimeout
Determina o tempo máximo que qualquer operação na sessão pode ser executada. Quando o intervalo expirar, a operação falhará. Insira um valor em milissegundos.
O valor padrão é 180.000 (3 minutos). Um valor 0 (zero) significa que não há tempo limite; a operação continua indefinidamente.