Las sesiones remotas de Powershell mueren aleatoriamente

Las sesiones remotas de Powershell mueren aleatoriamente

El siguiente código de Powershell es cómo inicio el control 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

Esto funciona muy bien en su mayor parte y podemos $s1 | Enter-PSSessionejecutar comandos o usar Invoke-Command -Session $s1 -ScriptBlock {some code}. Cuando ejecutamos trabajos particulares (generalmente Python o Java) que pueden tardar muchas horas en completarse, a veces la PSSession muere inesperadamente.

¿Necesito agregar diferentes o más -SessionOptions?

¿Hay alguna manera de saber por qué murió PSSession?

Editar

A continuación se muestra la salida 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

Agregué el siguiente código a mi rutina para iniciar PSSession, sin embargo, PSSessiontodavía se detiene sin motivo después de aproximadamente 2 horas.

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

Esto se basó en la siguiente descripción del -IdleTimeoutSecparámetro opcional en los documentos de Powershell de Microsoft.Desconectar-PSSession

También se explica bien en el noveno comando del Ejemplo 3 de los documentos de MS para el comando PowershellConnect-PSSession Ejemplosextraído a continuación.

# 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

Una locura que es un error en los documentos de MS o tiene que ver con una versión diferente de Powershell es que el comando anterior genera el siguiente error:

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

Sin embargo, el siguiente comando funciona bien cuando el valor entero pasado -IdleTimeoutSecse convierte en una cadena.

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

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

Respuesta1

Es posible que se esté encontrando con otro parámetro de tiempo de espera predeterminado distinto al IdleTimeout que ha utilizado.

Ejecute el comando New-PSSessionOptionsin parámetros (incluya el resultado en su publicación si desea que le echemos un vistazo). Preste especial atención a OperationTimeout.

De la documentación para Nueva opción PSSession:

-Tiempo de expiración de operación

Determina el tiempo máximo que puede ejecutarse cualquier operación en la sesión. Cuando expira el intervalo, la operación falla. Introduzca un valor en milisegundos.

El valor predeterminado es 180000 (3 minutos). Un valor de 0 (cero) significa que no hay tiempo de espera; la operación continúa indefinidamente.

información relacionada