TEMA
about_Remote_Jobs
DESCRIPCIÓN BREVE
Describe cómo se ejecutan los trabajos en segundo plano en equipos remotos.
DESCRIPCIÓN DETALLADA
Un trabajo en segundo plano es un comando que se ejecuta
asincrónicamente sin interactuar con la sesión actual. El símbolo
del sistema vuelve inmediatamente y se puede continuar usando la
sesión mientras se ejecuta el trabajo.
De forma predeterminada, los trabajos en segundo plano se
ejecutan en el equipo local. No obstante, se pueden usar varios
procedimientos para ejecutar trabajos en segundo plano en equipos
remotos.
En este tema se explica cómo se ejecuta un trabajo en segundo
plano en un equipo remoto. Para obtener información sobre cómo se
ejecutan los trabajos en segundo plano en un equipo local, vea
about_Jobs. Para obtener más información sobre los trabajos en
segundo plano, vea about_Job_Details.
TRABAJOS EN SEGUNDO PLANO REMOTOS
Existen tres métodos para ejecutar trabajos en segundo plano en
equipos remotos.
-- Puede iniciar una sesión interactiva con un equipo remoto e
iniciar un trabajo en la sesión interactiva. Los procedimientos
son los mismos que para la ejecución de un trabajo local, si bien
todas las acciones se realizan en el equipo remoto.
-- Puede ejecutar un trabajo en segundo plano en un equipo remoto
que devuelve los resultados al equipo local. Utilice este
método si desea recopilar los resultados de los trabajos en
segundo plano y mantenerlos en una ubicación central en el
equipo local.
-- Puede ejecutar un trabajo en segundo plano en un equipo remoto
que mantiene los resultados en el equipo remoto. Utilice este
método cuando los datos de los trabajos se mantienen con mayor
seguridad en el equipo que los originó.
INICIAR UN TRABAJO EN SEGUNDO PLANO EN UNA SESIÓN INTERACTIVA
Puede iniciar una sesión interactiva con un equipo remoto y, a
continuación, iniciar un trabajo en segundo plano durante la
sesión interactiva. Para obtener más información sobre las
sesiones interactivas, vea about_Remote y Enter-PSSession.
El procedimiento para iniciar un trabajo en segundo plano durante
una sesión interactiva es casi idéntico al procedimiento para
iniciar un trabajo en segundo plano en un equipo local. Sin
embargo, todas las operaciones se llevan a cabo en el equipo
remoto y no en el equipo local.
PASO 1: ENTER-PSSESSION
Use el cmdlet Enter-PSSession para iniciar una sesión interactiva
con un equipo remoto. Puede utilizar el parámetro ComputerName de
Enter-PSSession a fin de establecer una conexión temporal para la
sesión interactiva. O bien, puede usar el parámetro Session para
ejecutar la sesión interactiva en una sesión de Windows
PowerShell (PSSession).
El siguiente comando inicia una sesión interactiva en el equipo
Servidor01.
C:\PS> Enter-PSSession -computername Servidor01
El símbolo del sistema cambia para indicar que se ha conectado al
equipo Servidor01.
Servidor01\C:>
PASO 2: START-JOB
Utilice el cmdlet Start-Job para iniciar un trabajo en segundo
plano en la sesión.
El comando siguiente ejecuta un trabajo en segundo plano que
obtiene los eventos del registro de eventos de Windows PowerShell
en el equipo Servidor01. El cmdlet Start-Job devuelve un objeto
que representa el trabajo.
Este comando guarda el objeto de trabajo en la variable $job.
Servidor01\C:> $job = start-job -scriptblock {get-eventlog "Windows PowerShell"}
Mientras se ejecuta el trabajo, puede utilizar la sesión
interactiva para ejecutar otros comandos, incluidos otros
trabajos en segundo plano. Sin embargo, debe mantener abierta la
sesión interactiva hasta que se complete el trabajo. Si finaliza
la sesión, se interrumpirá el trabajo y se perderán los resultados.
PASO 3: GET-JOB
Para comprobar si se ha completado el trabajo, debe mostrar el
valor de la variable $job o utilizar el cmdlet Get-Job para
obtener el trabajo. El comando siguiente usa el cmdlet Get-Job
para mostrar el trabajo.
Servidor01\C:> get-job $job
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-eventlog "Windows PowerShell"
El resultado de Get-Job indica que el trabajo se está ejecutando
en el equipo "localhost" porque se inició y se ejecuta en el
mismo equipo (en este caso, Servidor01).
PASO 4: RECEIVE-JOB
Para obtener los resultados del trabajo, use el cmdlet
Receive-Job. Puede mostrar los resultados en la sesión
interactiva o guardarlos en un archivo ubicado en el equipo
remoto. El comando siguiente obtiene los resultados del trabajo
en la variable $job. El comando utiliza el operador de
redirección (>) para guardar los resultados del trabajo en el
archivo PsLog.txt ubicado en el equipo Servidor01.
Servidor01\C:> receive-job $job > c:\logs\PsLog.txt
PASO 5: EXIT-PSSESSION
Para finalizar la sesión interactiva, utilice el cmdlet
Exit-PSSession. El símbolo del sistema cambia para indicar que
está de nuevo en la sesión original en el equipo local.
Servidor01\C:> Exit-PSSession
C:\PS>
PASO 6: INVOKE-COMMAND: GET CONTENT
Para ver el contenido del archivo PsLog.txt ubicado en el equipo
Servidor01, inicie otra sesión interactiva o ejecute un comando
remoto. Se recomienda ejecutar este tipo de comando en una
PSSession (conexión persistente) en caso de que desee utilizar
varios comandos para investigar y administrar los datos del
archivo PsLog.txt. Para obtener más información sobre las
PSSessions, vea about_PSSessions.
Los comandos siguientes utilizan el cmdlet New-PSSession para
crear una PSSession que está conectada al equipo Servidor01 y
usan el cmdlet Invoke-Command para ejecutar un comando
Get-Content en la PSSession para ver el contenido del archivo.
C:\PS> $s = new-pssession -computername Servidor01
C:\PS> invoke-command -session $s -scriptblock {get-content c:\logs\pslog.txt}
INICIAR UN TRABAJO REMOTO QUE DEVUELVE LOS RESULTADOS AL EQUIPO LOCAL (ASJOB)
Para iniciar un trabajo en segundo plano en un equipo remoto que
devuelve los resultados de los comandos al equipo local, utilice
el parámetro AsJob de un cmdlet, como el cmdlet Invoke-Command.
Cuando se utiliza el parámetro AsJob, el objeto de trabajo se
crea en el equipo local, aunque el trabajo se ejecute en el
equipo remoto. Cuando se completa el trabajo, se devuelven los
resultados al equipo local.
Puede utilizar los cmdlets que contienen el sustantivo Job
(cmdlets Job) para administrar los trabajos creados por los
cmdlets. Muchos de los cmdlets que tienen parámetros AsJob no
utilizan la comunicación remota de Windows PowerShell, por lo que
puede utilizarlos incluso en los equipos que no estén
configurados para la comunicación remota y no cumplan los
requisitos referentes a la comunicación remota.
PASO 1: INVOKE-COMMAND -ASJOB
El comando siguiente utiliza el parámetro AsJob de Invoke-Command
para iniciar un trabajo en segundo plano en el equipo Servidor01.
El trabajo ejecuta un comando Get-Eventlog que obtiene los
eventos del registro del sistema. Puede utilizar el parámetro
JobName si desea asignar un nombre para mostrar al trabajo.
invoke-command -computername Servidor01 -scriptblock {get-eventlog system} -asjob
Los resultados del comando son similares a los que figuran a continuación.
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Running True Servidor01 get-eventlog system
Cuando se utiliza el parámetro AsJob, Invoke-Command devuelve el
mismo tipo de objeto que Start-Job. Puede guardar el objeto de
trabajo en una variable o utilizar un comando Get-Job para
obtener el trabajo.
Observe que el valor de la propiedad Location indica que el
trabajo se ejecutó en el equipo Servidor01.
PASO 2: GET-JOB
Para administrar un trabajo que se inició mediante el parámetro
AsJob del cmdlet Invoke-Command, utilice los cmdlet Job. Dado que
el objeto de trabajo que representa el trabajo remoto está en el
equipo local, no es necesario ejecutar comandos remotos para
administrar el trabajo.
Para determinar si el trabajo se ha completado, utilice un
comando Get-Job. El comando siguiente obtiene todos los trabajos
que se iniciaron en la sesión actual.
get-job
Dado que el trabajo remoto se inició en la sesión actual, un
comando Get-Job local obtiene el trabajo. La propiedad State del
objeto de trabajo indica que el comando se ejecutó correctamente.
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
1 Job1 Completed True Servidor01 get-eventlog system
PASO 3: RECEIVE-JOB
Para obtener los resultados del trabajo, use el cmdlet
Receive-Job. Dado que los resultados del trabajo se devuelven
automáticamente al equipo donde reside el objeto de trabajo,
puede obtener los resultados mediante un comando Receive-Job local.
El comando siguiente utiliza el cmdlet Receive-Job para obtener
los resultados del trabajo. Utiliza el identificador de sesión
para identificar el trabajo. Este comando guarda los resultados
del trabajo en la variable $results. Asimismo, puede redirigir
los resultados a un archivo.
$results = receive-job -id 1
INICIAR UN TRABAJO REMOTO QUE MANTIENE LOS RESULTADOS EN EL EQUIPO REMOTO
Para iniciar un trabajo en segundo plano en un equipo remoto que
mantiene los resultados de los comandos en el equipo remoto,
utilice el cmdlet Invoke-Command para ejecutar un comando
Start-Job en un equipo remoto. Puede utilizar este método para
ejecutar trabajos en segundo plano en varios equipos.
Cuando se ejecuta de forma remota un comando Start-Job, el objeto
de trabajo se crea en el equipo remoto y los resultados del
trabajo se mantienen en el equipo remoto.
Desde el punto de vista del trabajo, todas las operaciones son
locales. Simplemente se ejecutan los comandos de forma remota
para administrar un trabajo local en el equipo remoto.
PASO 1: INVOKE-COMMAND START-JOB
Use el cmdlet Invoke-Command para ejecutar un comando Start-Job
en un equipo remoto.
Este comando requiere una PSSession (conexión persistente). Si
utiliza el parámetro ComputerName de Invoke-Command para
establecer una conexión temporal, se considera que el comando
Invoke-Command se ha completado cuando se devuelve el objeto de
trabajo. Como resultado, se cierra la conexión temporal y se
cancela el trabajo.
El siguiente comando utiliza el cmdlet New-PSSession para crear
una PSSession que está conectada al equipo Servidor01. El comando
guarda la PSSession en la variable $s.
$s = new-pssession -computername Servidor01
El siguiente comando utiliza el cmdlet Invoke-Command para
ejecutar un comando Start-Job en la PSSession. Los comandos
Start-Job y Get-Eventlog están entre llaves.
invoke-command -session $s -scriptblock {start-job -scriptblock {get-eventlog system}}
Los resultados son similares a los que figuran a continuación.
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
2 Job2 Running True Localhost get-eventlog system
Cuando se ejecuta de forma remota un comando Start-Job,
Invoke-Command devuelve el mismo tipo de objeto de trabajo que
Start-Job. Puede guardar el objeto de trabajo en una variable o
utilizar un comando Get-Job para obtener el trabajo.
Observe que el valor de la propiedad Location indica que el
trabajo se ejecutó en el equipo local, denominado "LocalHost",
aunque el trabajo se ejecutó en el equipo Servidor01. Dado que el
objeto de trabajo se crea en el equipo Servidor01 y el trabajo se
ejecuta en el mismo equipo, se considera que se trata de un
trabajo en segundo plano local.
PASO 2: INVOKE-COMMAND GET-JOB
Para administrar un trabajo en segundo plano remoto, utilice los
cmdlets Job. Dado que el objeto de trabajo está en el equipo
remoto, deberá ejecutar comandos remotos para obtener, detener,
aguardar o recuperar los resultados del trabajo.
Para comprobar si se ha completado el trabajo, utilice un comando
Invoke-Command para ejecutar un comando Get-Job en la PSSession
conectada al equipo Servidor01.
invoke-command -session $s -scriptblock {get-job}
El comando devuelve un objeto de trabajo. La propiedad State del
objeto de trabajo indica que el comando se ejecutó correctamente.
SessionId Name State HasMoreData Location Command
--------- ---- ----- ----------- -------- -------
2 Job2 Completed True LocalHost get-eventlog system
PASO 3: INVOKE-COMMAND RECEIVE-JOB
Para obtener los resultados del trabajo, utilice el cmdlet
Invoke-Command para ejecutar un comando Receive-Job en la
PSSession conectada al equipo Servidor01.
El comando siguiente utiliza el cmdlet Receive-Job para obtener
los resultados del trabajo. Utiliza el identificador de sesión
para identificar el trabajo. Este comando guarda los resultados
del trabajo en la variable $results. Utiliza el parámetro Keep de
Receive-Job para mantener el resultado en la memoria caché de
trabajos del equipo remoto.
$results = invoke-command -session $s -scriptblock {receive-job -sessionid 2 -keep}
También puede redirigir los resultados a un archivo en el equipo
local o remoto. El comando siguiente utiliza un operador de
redirección para guardar los resultados en un archivo ubicado en
el equipo Servidor01.
invoke-command -session $s -command {receive-job -sessionid 2 > c:\logs\pslog.txt}
VEA TAMBIÉN
about_Jobs
about_Job_Details
about_Remote
Invoke-Command
Start-Job
Get-Job
Wait-Job
Stop-Job
Remove-Job
New-PSSession
Enter-PSSession
Exit-PSSession