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