martes, 10 de agosto de 2010

Trabajos en Segundo Plano

Cuando ejecutamos un cmdlet en el consola host de PowerShell, la consola espera a que el cmdlet termine su ejecución. Mientras un cmdlet está en ejecución, la consola no permite introducir más cmdlets. Sin embargo, a partir de la versión 2.0 de PowerShell, disponemos de un conjunto de cmdlets que nos permtien la ejecución de cmdlets en segundo plano, de tal manera que podemos realizar varias tareas simultaneamente en una única consola.

Los cmdlets para la gestión de trabajos en segundo plano son:

Get-Job. Nos muestra una lista de todos los trabajos que se han ejecutado (o se están ejecutando) en segundo plano en la instancia de PowerShell actual.
Receive-Job. Se usa para acceder a la salida producida por un trabajo en segundo plano.
Remove-Job. Se elimina un trabajo en segundo plano.
Start-Job. Se lanza un trabajo en segundo plano.
Stop-Job. Se para un trabajo en segundo plano
Wait-Job. Suprime el símbolo del sistema hasta que uno o todos los trabajos en segundo plano de Windows PowerShell que se ejecutan en la sesión se completen.

Nota. Algunos cmdlets disponen del parámetro AsJob, que hace lo mismo que Start-Job.


Ejemplo. Lanzar un trabajo en segundo plano:

start-job {Start-Sleep 90}

Nota. Este trabajo se ejecuta en una nueva instancia de PoweShell.


Ejemplo. Para ver todos los procesos en segundo plano:

get-job


Si un trabajo tiene el estado "Failed", podemos ver la razón del fallo en:

$job.ChildJobs[0].JobStateInfo.Reason


Ejemplo.Vamos a lanzar ahora el siguiente proceso en segundo plano:

$job1=Start-Job { for ($i=0;$i -lt 10;$i++) { Start-Sleep 10; Write-Host "Bucle número: $i"} }


Este proceso está sacando por pantalla una serie de información. Sin embargo, al estar en segundo plano, no vamos a ver la salida, sino que se está almacenando en una caché de procesos de segundo plano. Si queremos acceder a esa información, haremos uso del cmdlet Receive-Job.

Ejemplo. Para ver si hay datos en la caché para nuestro trabajo en segundo plano:

$job1.HasMoreData. Si el resultado es True, significa que hay datos.

Para obtenerlos: Receive-Job $job1

Nota. Una vez que hemos accedido a los datos, estos se eliminan de la caché. Para consultarlos y no eliminarlos de la caché, haremos:
Receive-Job $job1 -Keep

Nota. Si al crear el trabajo, no lo hemos asociado a una variable, podemos acceder a nuestro trabajo mediante el id:

$trabajo1=Get-Job -Id 3
Receive-Job -Id 4


etc.

No hay comentarios:

Publicar un comentario