Una de las características de PowerShell es que solo un comando se puede estar ejecutando en cada momento, de forma que si tenemos procesos que tardan en finalizar, tenemos que esperar para poder seguir la ejecución de los siguientes. Para poder evitar este problema, tenemos la opción de los Trabajos en segundo plano de PowerShell. Un trabajo es un proceso que se ejecuta en segundo plano de forma que no bloquea la ejecución de otras tareas, y podemos acceder a los resultados del trabajo cuando queramos.
Las características principales de los Trabajos son:
- Los trabajos consisten en un Trabajo Padre y uno o varios Trabajos Hijo
- El Trabajo Padre coordina los Trabajos Hijo
- Normalmente ejecutamos los cmdlet en el Trabajo Padre
Crear un trabajo
Para crear un trabajo tenemos dos opciones:
- Cmdlet: Start-Job:
- Normalmente utilizado para acceder a recursos locales
- Permite ejecutar un bloque de comandos o un script
- Permite darle un nombre al Trabajo
- Permite pasar un listado de argumentos
- Permite inicializar el entorno, por ejemplo, importando un módulo
- Parámetro: -AsJob
- Utilizado principalmente para accesos a recursos remotos
- No se puede establecer el nombre del Trabajo
- Se utiliza principalmente con los cmdlet
- Invoke-Command
- Get-VMIObject
- Invoke-WMIMethod
- Restart-Computer
Ejemplo: Si queremos obtener un listado de todos los archivos de una unidad con el comando Get-ChildItem puede tardar varios segundos o incluso minutos en terminar de ejecutarse. Podemos probarlo
1 |
Get-ChildItem C:\ -Recurse |
Y mientras está en ejecución no podemos realizar ninguna tarea en el mismo entorno PowerShell
Para facilitar el trabajo vamos a crear el comando anterior como un Trabajo
1 |
Start-job { Get-ChildItem C:\ -Recurse } -Name ListadoCompleto |
Vemos que se ha creado un trabajo con el identificador 6, el nombre ListadoCompleto.
Gestionando los Trabajos
En el punto anterior hemos creado un trabajo pero no tenemos control sobre él, no podemos saber cuando va a terminar, ni nos va a avisar cuando lo haga, ni sabemos como pararlo si es necesario.
Para esto tenemos varios cmdlets:
- Get-Job: como todo en PowerSehll, un trabajo también es un objeto y lo podemos obtener con este comando. Para obtener el comando podemos utilizar varias de las propiedades del trabajo: Id, Nombre, Estado, Fecha…
1 2 3 4 5 |
Get-Job Get-Job -id 6 Get-Job -Name Listado* Get-Job -Status Completed Get-Job -Status Running |
- Wait-Job: permanece a la espera hasta que un trabajo termina. Podemos utilizar los propiedades como en Get-Job para identificar el trabajo.
1 |
Wait-Job -Name ListadoCompleto |
- Stop-Job: nos permite terminar un trabajo, normalmente si hay algún problema con él.
1 |
Get-Job -Name ListadoCompleto | Stop-Job |
- Remove-Job: permite eliminar un trabajo, ya que aunque un trabajo se haya completado sigue existiendo hasta que terminemos la sesión de PowerShell. Antes de eliminarlo es necesario parar el trabajo.
1 |
Get-Job -Name ListadoCompleto | Remove-Job |
Obtener resultados
Para obtener los resultados de la ejecución del trabajo se utiliza Receive-Job. Cuando lo utilizamos, por defecto, se elimina el resultado del trabajo, aunque esté siga existiendo, salvo que lo indiquemos con el parámetro -Keep
1 |
Get-Job -Name ListadoCompleto | Receive-Job |
Estado de los Trabajo
Los trabajos pueden estar en varios estados
- Running
- Stopped
- Completed
- Failed
Si un Trabajo ha fallado, podemos acceder a la propiedad JobStateInfo, que nos suele mostrar información del error que se ha producido
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?
3 comentarios
Pingback: Curso básico de Powershell: Introducción | El Blog de Negu
Pingback: Curso básico de Powershell: Instalación y Requerimientos | El Blog de Negu
Pingback: Curso básico de Powershell: Importar y Exportar datos | El Blog de Negu