
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-PSSession
ejecutar 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 -SessionOption
s?
¿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, PSSession
todaví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 -IdleTimeoutSec
pará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 -IdleTimeoutSec
se 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-PSSessionOption
sin 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.