Question
Gestion TimeOut
- GOGET
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 4
- Remerciements reçus 0
Je travaille actuellement sur un script PS et je suis bloqué sur la gestion du TimeOut.
Dans une boucle foreach, j'utilise la cmdlet copy-item pour copier des fichiers sur plusieurs serveurs et je souhaite établir un timeout au cas où une copie prendrait trop de temps.
La solution à mon problème est-elle la mise en place d'un compteur et si oui comment cela fonctionne sur PS?
Merci d'avance pour vos réponses
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
FLBSLB écrit:
Première idée un job, premier problème en V2 le job ne porte pas l'information de l'heure de démarrageLa solution à mon problème est-elle la mise en place d'un compteur et si oui comment cela fonctionne sur PS?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- GOGET
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 4
- Remerciements reçus 0
Salut,Salut,
FLBSLB écrit:Première idée un job, premier problème en V2 le job ne porte pas l'information de l'heure de démarrageLa solution à mon problème est-elle la mise en place d'un compteur et si oui comment cela fonctionne sur PS?
<br><br>Message édité par: Laurent Dardenne, à: 29/11/13 16:34
désolé je n'ai pas précisé la version dans laquelle je dois travailler. C'est la V2
Donc d'après ce que tu me dis je ne peux pas le faire dans un Job?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Si, mais pour que ton job puisse porter l'information de l'heure de démarrage afin de le supprimer lors du timeout, il faut que ton nom de job porte cette information. C'est possible, mais le code est de niveau avancé.Donc d'après ce que tu me dis je ne peux pas le faire dans un Job?
La construction du nom du job :
[code:1]
#On utilise \ comme séparateur, car la méthode ToBinary() renvoi un entier négatif
$JobName=\"$NomMachine\$([DateTime]::Now.ToBinary())\"
[/code:1]
L récupération de l'heure :
[code:1]
Function Split-XXJobName {
#Parse le nom d'un Job et renvoi un objet
param ($XXJobName)
$Nom,$Date=$XXJobName -split \"\\\"
New-Object PSObject -Property @{NomMachine=$Nom ;
StartTime=([DateTime]::FromBinary($Date));
ID=$null;
State=$Null;
Name=$JobName #Nom du job utilisé par Stop-Job
}
}
[/code:1]
La gestion du time out :
[code:1]
#Surveillance du temps d'exécution des jobs (TimeOut)
$TimeOutJob = New-Object Timers.Timer
#On s'abonne à l'événement Timer.Elapsed déclenché par $TimeOutJob
$Global:JobTimerElapsed=Register-ObjectEvent $TimeOutJob Elapsed -SourceIdentifier Timer.Elapsed –Action {
#On parcourt la liste des job XX, ou XX est un préfix normé
Get-XXJob|
#La date actuelle moins la date de démarrage du job doit être inférieure au timeout
Where { (Get-Date -$_.StartTime) -gt $XXTimeOutJobInterval }|
# On supprime le job
#Son état bascule en Stopped, son event StateChanged est déclenché
#Voir la suite du traitement dans Watch-XXJob
Remove-Job -Force
}
$TimeOutJob.Interval = $XXTimerIntervalJob.TotalMilliseconds
$TimeOutJob.Autoreset = $True
[/code:1]
Fonction de récupération des jobs normés :
[code:1]
Function Get-XXInfoJob {
param ($XXJobName)
Foreach($Job in Get-Job -Name $XXJobName)
{
$SplittedName=Split-XXJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
}
$SplittedName
}
Function Get-XXMJob {
#Renvoi pour chaque JOB de mise à jour :
# Son ID, son état, le nom de la machine cible, la date de création du job et le nom du Job
Foreach($Job in Get-Job|Where {$_.Name -match \"^XX\"})
{
$SplittedName=Split-XXJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
$SplittedName
}
}
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 29/11/13 18:53
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- GOGET
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 4
- Remerciements reçus 0
Salut,FLBSLB écrit:
Si, mais pour que ton job puisse porter l'information de l'heure de démarrage afin de le supprimer lors du timeout, il faut que ton nom de job porte cette information. C'est possible, mais le code est de niveau avancé.Donc d'après ce que tu me dis je ne peux pas le faire dans un Job?
La construction du nom du job :
[code:1]
#On utilise \ comme séparateur, car la méthode ToBinary() renvoi un entier négatif
$JobName=\"$NomMachine\$([DateTime]::Now.ToBinary())\"
[/code:1]
L récupération de l'heure :
[code:1]
Function Split-XXJobName {
#Parse le nom d'un Job et renvoi un objet
param ($XXJobName)
$Nom,$Date=$XXJobName -split \"\\\"
New-Object PSObject -Property @{NomMachine=$Nom ;
StartTime=([DateTime]::FromBinary($Date));
ID=$null;
State=$Null;
Name=$JobName #Nom du job utilisé par Stop-Job
}
}
[/code:1]
La gestion du time out :
[code:1]
#Surveillance du temps d'exécution des jobs (TimeOut)
$TimeOutJob = New-Object Timers.Timer
#On s'abonne à l'événement Timer.Elapsed déclenché par $TimeOutJob
$Global:JobTimerElapsed=Register-ObjectEvent $TimeOutJob Elapsed -SourceIdentifier Timer.Elapsed –Action {
#On parcourt la liste des job XX, ou XX est un préfix normé
Get-XXJob|
#La date actuelle moins la date de démarrage du job doit être inférieure au timeout
Where { (Get-Date -$_.StartTime) -gt $XXTimeOutJobInterval }|
# On supprime le job
#Son état bascule en Stopped, son event StateChanged est déclenché
#Voir la suite du traitement dans Watch-XXJob
Remove-Job -Force
}
$TimeOutJob.Interval = $XXTimerIntervalJob.TotalMilliseconds
$TimeOutJob.Autoreset = $True
[/code:1]
Fonction de récupération des jobs normés :
[code:1]
Function Get-XXInfoJob {
param ($XXJobName)
Foreach($Job in Get-Job -Name $XXJobName)
{
$SplittedName=Split-XXJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
}
$SplittedName
}
Function Get-XXMJob {
#Renvoi pour chaque JOB de mise à jour :
# Son ID, son état, le nom de la machine cible, la date de création du job et le nom du Job
Foreach($Job in Get-Job|Where {$_.Name -match \"^XX\"})
{
$SplittedName=Split-XXJobName $Job.Name
$SplittedName.ID=$Job.Id
$SplittedName.State=$Job.State
$SplittedName
}
}
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 29/11/13 18:53
Que dire! En premier un grand Merci.
Ensuite, ça semble énorme comme code pour la simple gestion d'un Timeout!
N'y a-t-il vraiment pas plus simple?
@+
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Oui, la gestion du timeout est simple à énoncer, son codage déjà moins.Ensuite, ça semble énorme comme code pour la simple gestion d'un Timeout!
Mon approche était asynchrone (traitement en // de copie de fichiers vers + cibles). A l'origine basée sur Robocopy afin de bénéficier des logs et des retry (réseau WIFI).
FLBSLB écrit:
A étudier.N'y a-t-il vraiment pas plus simple?
Dans tous les cas on doit avoir un mécanisme synchrone de copie de fichier sur lequel un autre mécanisme aura la main.
Essaie avec Wait-Job , dans ce cas tu as une copie avec timeout, mais synchrone.
Attention le code cité est une version optimiste, il suppose que tout se passe bien, tout le temps...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Gestion TimeOut