Question Limiter le nombre de Job

Plus d'informations
il y a 13 ans 9 mois #7249 par Arthur
Limiter le nombre de Job a été créé par Arthur
Bonjour.
Voilà j'ai encore un problème avec mon script qui analyse les Envent Logs.
Aujourd'hui j'ai voulu un peu m'amuser un peu et j'ai donc lancé l'analyse des Event logs d'environ 1000 pc (virtuelles ;) )
Et je me suis rendu compte d'une grave erreur de ma part.
En effet mon script récupère les logs en même temps grâce aux jobs.
Seul bémol quand on 1000 pc ben... on a 1000 Job. :lol:
Et la...c'est le drame, Windows n'aime pas ca du tout ( c'est normal 1000 job = 1000 processus :whistle: )

Bref après pas mal de réflexion, j'ai pensé que la meilleur solution serait de mettre en place un \"contrôle des jobs\", en gros on limiterais le nombre de jobs à 20 par exemple(c'est déjà bien), et à chaque fois que l'on aura plus de 20 job on met la création des jobs en pause jusqu'à qu'il n'y est plus de Jobs pour ensuite reprendre le script.
Seulement j'avoue que je ne m'y connais pas beaucoup en job et je n'y arrive pas.
Je ne sait pas trop où commencer pour créer ce \"controle\"
Quelqu'un aurait une piste?
Merci.

Edit: Bon j'avais oublié de mettre un start-sleep dans ma fonction de contrôle. :pinch:
Ça peut toujours faire un script intéressant pour les gens qui veulent réaliser des taches en \"parallèle\" :)




J'ai fait une version ultra simplifié de mon script :

[code:1][String[]]$ListeOrdi = Get-content ./liste.txt
$global:Log = New-Object Collections.ArrayList
$Count = 0

foreach( $pc_nom in $ListeOrdi) {
$Count++
}

foreach( $pc_nom in $ListeOrdi) {
$X = 0
Write-Host $pc_nom
$I++
$NomAssociation=\"Job_Log_$i\"


#Controle des Job
$nb_job = (Get-Job).Count
Write-Host $nb_job
if($nb_job -ge 10)
{
while( $nb_job -ge 5)
{
$nb_job = (Get-Job).Count
Start-sleep 1
}
}

#Initialisation du Job

$CurrentJob=Start-Job -ArgumentList \"$pc_nom\" -Name $NomAssociation -ScriptBlock {
param($pc_nom)
Try
{
Write-Host \" Récupération des log de l'ordinateur : $pc_nom \"
$ping = Get-WmiObject -Class Win32_PingStatus -Filter \"Address='$pc_nom'\"
if ($ping.StatusCode -eq 0)
{
$Log_1 = Get-EventLog -EntryType Error -ComputerName \"$pc_nom\" -LogName \"Application\" -Newest 20 | Get-Unique -OnType
}
else
{
Write-Host \" L'ordinateur : $pc_nom n'existe pas \"
}
}
Catch
{
Throw $_
}
}



$null=Register-ObjectEvent $CurrentJob StateChanged -SourceIdentifier \"StateChanged_$NomAssociation\" -MessageData $objlog_nom1 -Action {
$eventname=$EventArgs.JobStateInfo.ToString()
Write-host \"Evénement : $($EventSubscriber.SourceIdentifier) Status : $eventname\"

Switch ($eventname) {


'Completed' {


Receive-Job -id $Sender.Id |
Foreach { [void]$global:Log.Add($_)}
Write-Warning \"Supprime le job de récupération d'un log.\"
Remove-Job -id $Sender.Id

break
}

'Failed' {

Write-host (\"Le job {0} a déclenché l'erreur : {1}\" -F $Sender.Id, (Get-job -id $Sender.Id).Childjobs[0].JobStateInfo.Reason.Message) -fore Red

break
}

'Stopped' {
Write-Warning (\"Le job {0} a été arrêté.\" -F $Sender.Id)
break
}

default { Write-Warning \"cas non géré.\" }

}
[Void]$global:Job_terminer++

Write-Warning \"Annule l'abonnement de l'event 'StateChanged' du job de récupération d'un log.\"
UnRegister-Event -SubscriptionId $EventSubscriber.SubscriptionId
Write-Warning \"Supprime le job lié à la gestion de l'événement 'StateChanged' du job de récupération d'un log.\"
Remove-job -id $EventSubscriber.Action.Id
}

}
while ( $Job_terminer -lt $Count)
{
Write-Host \"Récupération en cours \"
Start-Sleep -Seconds 1
}
Write-Host \"Récupération Terminer\"

[/code:1]

Message édité par: bilbao, à: 24/06/10 15:30

Message édité par: bilbao, à: 24/06/10 15:54<br><br>Message édité par: bilbao, à: 24/06/10 15:55

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #7256 par Arnaud Petitjean
Salut Bilbao,

Pour limiter l'envoi de jobs simultanés, je te conseille d'utiliser le paramètre -Throttlelimit de la commande Invoke-Command suivi du commutateur -AsJob.
Malheureusement Start-Job n'a pas ce paramètre, mais Invoke-Command fait la même chose avec AsJob.

Regarde cet exemple tiré de l'aide Start-Job :

C:\PS&gt;$jobWRM = invoke-command -computerName (get-content servers.txt) -scriptblock {get-service winrm} -jobname Wi
nRM -throttlelimit 16 -AsJob

Description


Cette commande utilise l'applet de commande Invoke-Command et son paramètre AsJob pour démarrer une tâche en arrièr
e-plan qui exécute une commande « get-service winrm » sur plusieurs ordinateurs. Parce que la commande s'exécute su
r un serveur qui traite un trafic réseau substantiel, la commande utilise le paramètre ThrottleLimit d'Invoke-Comma
nd pour limiter à 16 le nombre de commandes simultanées.


Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #7262 par Arthur
Réponse de Arthur sur le sujet Re:Limiter le nombre de Job
Merci en effet je ne connaissais pas ce paramètre.
En revanche comment marche Invoke-Command en local?
(Va il faire tout le même bousin que sur un ordinateur à distance?)
Peut il ralentir le script?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #7263 par Arnaud Petitjean

En revanche comment marche Invoke-Command en local?


Il fonctionne exactement comme Start-Job.

Va il faire tout le même bousin que sur un ordinateur à distance?


Il me semble que oui (sur à 95%).

Peut il ralentir le script?


Je ne pense pas.

Pour le savoir, utilise la commande Measure-Command.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.074 secondes
Propulsé par Kunena