Les Jobs Powershell
Bonjour,
Au menu aujourd’hui l’utilisation des Jobs Powershell. Tout d’abord quelques généralités sur les jobs…
Avec Powershell v1, les opérations étaient synchrones, c’est à dire exécutées les unes à la suite des autres.
Dans Powershell v2, grâce à la notion de jobs, des nouvelles façons de scripter sont possibles:
- Fonctionnement asynchrone
- Possibilité de faire tourner plusieurs tâches en parallèle sur des machines distantes ou locales (Powershell reste bien sur mono thread)
- La session courante n’est pas bloquée en attenant le résultat d’un job.
Lorsque vous démarrer un job en tâche de fond, un objeet de type Job est retourné immédiatement, et ce, même si le job n’est pas terminé.
Pour aller plus loin, voici la liste des méthodes et propriétés accessibles sur un object de type Job.
L’objet Job ne contiendra pas directement le résultat de l’opération, il faut l’appeler via Receive-Job. Une fois le résultat du job collecté, les données sont suprrimées du buffer, à moins de spécifier le paramètre -keep.
Les jobs Powershell s’appuient sur WinRM pour fonctionner, une nouvelle session est créé pour effectuer le traitement, en parallèle de la session de l’utilisateur actuel.
[powershell]
Start-Job -Name <nomdujob> -Scriptblock { <commande/script> }
[/powershell]
Pour démarrer un job sur une machine distante..
Avec une session temporaire
[powershell]
Invoke-Command -Computername <server> { <commande/script> } -ASjob
Invoke-Command -Computername <server> { Start-Job -scriptblock { <commande/script> } }
[/powershell]
Avec une session persistante
[powershell]
Invoke-Command –Session <session> {Commande/Script} –AsJob
Invoke-Command –Session <session> {Start-Job –ScriptBlock {Commande/Script}}
[/powershell]
Avec une session interactive
[powershell]
Enter-PSSession -Computername <server> / Enter-PSSession -session <session>
[/powershell]
Suivi de
[powershell]
Start-Job -Name <job> -Scriptblock { <commande/script> }
[/powershell]
Pour récupérer le statut de jobs en cours vous pouvez utiliser la cmdlet Get-Job
[powershell]
Get-Job
[/powershell]
Pour stopper un job en cours.
[powershell]
Stop-Job –Id <id>
Stop-Job –Job <name>
Stop-Job –State Terminated
[/powershell]
Pour mettre une temporisation avant la fin du job powershell
[powershell]
Wait-Job –Id <id>
Wait-Job –Job <name> -TimeOut
[/powershell]
On peut attendre qu’un job lancé en tâche de fond termine (exécution synchrone d’un job asynchrone)
On perd toute interaction avec le shell tant que le job n’est pas terminé mais on peut spécifier un timeout (en secondes), sinon on attend indéfiniment
Quand le job est terminé, on retrouve le prompt powershell et on a un objet de type job qui est retourné
On peut ainsi concevoir des scripts distribuant différentes tâches de manière asynchrone et si besoin de précédence, on peut temporiser pour avoir les données à traiter par les instructions suivantes
Pour supprimer des jobs
[powershell]
Remove-Job *
Remove-Job –Name <name>
Remove-Job –ID <id>
Remote-Job –State Terminated
[/powershell]
Avant de pouvoir supprimer un job avec Remove-Job, il faut s’assurer que le job n’est plus en cours sous peine d’avoir une erreur en retour (possibilité d’utiliser le paramètre –Force sinon)
Il faut supprimer les jobs, sinon les sessions et leur contenus restent en mémoire
C’est tout pour les jobs sous Powershell v2, bonne utilisation.
Et bonne journée !