IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Problème d'appels de CVS depuis PoSH [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut Problème d'appels de CVS depuis PoSH
    Bonjour,
    Nouveau défi pour Laurent !!

    P'ti résumé :
    - j'ai une plateforme de build faites avec quelques scripts PoSH. Première version sous XP Pro + PoSH v1 + PSEventing, ça marche tous les jours.
    - là j'ai besoin d'évoluer, je porte tout sur W7 64 + PoSH v2 + Eventing intégré à PoSH (là où tu m'as déjà grandement aidé).

    Sur cette nouvelle plateforme, j'ai un gros souci d'appels à CVS, après avoir buildé quelques projets, il m'est impossible d'appelr CVS dans la session PoSH en question. Je n'ai aucun log, aucune erreur, aucun crash, c'est juste que le process ne se lance même pas, il n'apparaît pas non plus dans le Task Manager...rien, c'est complètement muet.

    Si j'ouvre une console DOS ou une 2é console PoSH, pas de souci, CVS répond à nouveau. Si je lance un autre process, genre notepad, dans ma session PoSH où j'ai le problème, pas de souci non plus, notepad se lance. Mais CVS...rien.

    Voici pour info, la fonction qui me sert à lancer les process externes dans mes scripts :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function Launch-Process([System.Diagnostics.Process]$process, [string]$log, [int]$timeout = 0)
    {
        Register-ObjectEvent -InputObject $process -EventName ErrorDataReceived -SourceIdentifier Common.LaunchProcess.Error -action {
            if(-not [string]::IsNullOrEmpty($EventArgs.data))
            {
                global:Log-Message $log ERROR $EventArgs.data
            }
        }
        Register-ObjectEvent -InputObject $process -EventName OutputDataReceived -SourceIdentifier Common.LaunchProcess.Output -action {
            if(-not [string]::IsNullOrEmpty($EventArgs.data))
            {
                global:Log-Message $log Info $EventArgs.data
            }
        }
    
        $process.Start() 
        $process.BeginErrorReadLine()
        $process.BeginOutputReadLine() 
        
        $ret = $null
        if($timeout -eq 0)
        {
            $process.WaitForExit()
            $ret = $true
        }
        else
        {
            if(-not($process.WaitForExit($timeout)))
            {
                global:Log-Message $log WARNING "The process is not completed, after the specified timeout: $($timeout)"
                $ret = $false
            }
            else
            {
                $ret = $true
            }
        }
        
        # Cancel the event registrations
        Unregister-Event -SourceIdentifier Common.LaunchProcess.Error
        Unregister-Event -SourceIdentifier Common.LaunchProcess.Output
        
        $process.Close()
        $ret
    }
    Je suis comment dire....bloqué là dessus

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    essaie déjà, dans ta fonction, d'ajouter la suppression des jobs liés aux events.
    Sinon Launch-Process est-elle exécutée en synchrone, (Les uns à la suite des autres) ?
    La fonction est appelée, mais sans créer de process, c'est bien ça ?

  3. #3
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Salut Laurent et merci encore de donner de ton temps.

    Je ne sais pas si j'ai été clair dans mon premier message, mais sur nos 30 projets (environ), mon script en traîte environ la moitié avant de ne plus fonctionner. C'était juste pour préciser le problème.

    Mes process sont créés dans une fonction dédiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function Create-Process
    {
        # Common process object used by many common functions
        $process = New-Object -TypeName System.Diagnostics.Process
        $process.StartInfo.CreateNoWindow = $false
        $process.StartInfo.RedirectStandardError = $true
        $process.StartInfo.RedirectStandardOutput = $true
        $process.StartInfo.UseShellExecute = $false
        return $process
    }
    Puis le process est personnalisé, par exemple pour CVS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $process = Create-Process
    $process.StartInfo.FileName = "cvs.exe"
    $process.StartInfo.Arguments += " -d $($cvsroot) checkout -P -d $($dirs[1]) $($project)"
    Launch-Process $process $log
    La fonction Launch-Process est synchrone, elle attend la fin du process avant de sortir.

    Mon script global est une boucle foreach (pour chaque projet) qui déroule tout une séquence :
    - checkout CVS
    - creation des dossiers de sortie,
    - collecte des dépendances
    - build java
    - build .net
    ...

    Et tout ça génère des logs qui sont assez conséquents, environ 80000 lignes pour les plus gros logs.

    Quand tu parles de supprimer les jobs liés aux events, c'est pas suffisant d'avoir écrit ça à la fin de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Unregister-Event -SourceIdentifier Common.LaunchProcess.Error
        Unregister-Event -SourceIdentifier Common.LaunchProcess.Output
    Tu penses à quoi d'autre ?

    J'ai l'impression qu'il y a un truc qui reste ouvert ou qui sature, mais j'arrive pas à diagnostiquer d'où ça vient parce que j'ai vraiment aucun message pour m'indiquer le problème.

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par romut Voir le message
    Quand tu parles de supprimer les jobs liés aux events, c'est pas suffisant d'avoir écrit ça à la fin de la fonction :
    Non, le job dédié à l'event est arrêté, mais pas supprimé. Voir ce tuto, chapitre 5.2
    Citation Envoyé par romut Voir le message
    J'ai l'impression qu'il y a un truc qui reste ouvert ou qui sature, mais j'arrive pas à diagnostiquer d'où ça vient parce que j'ai vraiment aucun message pour m'indiquer le problème.
    Tu peux vérifier :
    -les états des jobs avant de les supprimer et vérifier s'ils n'ont pas données à émettre.
    - à l'aide de WMI si le process est bien créé et terminé dans la fonction launch. A noter que Start renvoie une valeur que tu ne testes pas.
    -si la fonction log-message ne verrouille pas le fichier, a priori non.
    - si l'appel à [gc];;Collect() ou l'ajout d'un sleep entre chaque appel change qq chose...

    C'est plus du debug qu'autre chose, mais là je ne vois pas ce qui peut poser pb.
    Tu peux aussi tracer avec Process Explorer de sysinternals.

    Sinon tu utilises PS 32 ou 64 bits ?

  5. #5
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Non, le job dédié à l'event est arrêté, mais pas supprimé. Voir ce tuto, chapitre 5.2
    J'ai lu, finalement y a pas besoin des appels à Unregister-Event, Stop-Job puis Remove-Job suffit, je vais tenter le truc car dans ma console qui est toujours bloqué, en faisant Get-Job, j'ai 504 jobs Common.LaunchProcess...

    Donc là, effectivement, y a du nettoyage à faire !

    Citation Envoyé par Laurent Dardenne Voir le message
    Tu peux vérifier :
    -les états des jobs avant de les supprimer et vérifier s'ils n'ont pas données à émettre.
    - à l'aide de WMI si le process est bien créé et terminé dans la fonction launch. A noter que Start renvoie une valeur que tu ne testes pas.
    -si la fonction log-message ne verrouille pas le fichier, a priori non.
    - si l'appel à [gc];;Collect() ou l'ajout d'un sleep entre chaque appel change qq chose...

    C'est plus du debug qu'autre chose, mais là je ne vois pas ce qui peut poser pb.
    Tu peux aussi tracer avec Process Explorer de sysinternals.

    Sinon tu utilises PS 32 ou 64 bits ?
    J'utilise PoSH 64, c'est celui lancé par défaut sur Windows 64 quand tu vas pas chercher explicitement la version 32 bits.

    Pour le reste, merci, ça me donne des pistes, stay tuned....

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par romut Voir le message
    finalement y a pas besoin des appels à Unregister-Event, Stop-Job puis Remove-Job suffit
    Oui, bien que dans tous les cas on doit mémoriser le numéro du job lié à l'event.
    De mon coté j'ai une préférence pour le couple Unregister-Event + Remove-Job, cela documente explicitement l'abonnement et le désabonnement.
    Citation Envoyé par romut Voir le message
    J'utilise PoSH 64, c'est celui lancé par défaut sur Windows 64 quand tu vas pas chercher explicitement la version 32 bits.
    As-tu testé ton traitement sous PS 32 bits ?

  7. #7
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    J'ai posté déjà dans le forum "Official Scripting Guys", pour le moment (quelques jours quand même), pas de réponse.

    J'ai ajouté l'appel au GC à chaque boucle, configurer la tâche pour qu'elle s'active avec les plus hauts privilèges, rien à faire.

    Ca me fatigue....

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par romut Voir le message
    Ca me fatigue....
    Je compatis.
    As-tu réfléchi à un autre moyen pour déclencher ton traitement ?
    un service, WMI ?
    Que fait ton traitement si tu exécutes uniquement CVS sans toute la mécanique de job, juste un start-process ?
    As-tu recherché/poster dans les forums de support CVS ?
    As-tu consulté MSConnect au sujet du scheduler ?

    Sinon demander dans le forum prog Win32.

  9. #9
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Salut Laurent,
    Non je n'ai pas regardé tout ça, car mon script fonctionnant parfaitement en sous XP, j'ai pas envie de tout revoir.

    J'ai quand même trouvé quelques trucs, même si, pour le moment, rien n'est réglé.

    - En tâche automatique, et même si la tâche s'exécute sous le compte Robot, tous les paramètres de ce compte ne semblent utilisés, en particulier, si je lance la tâche moi même ou en automatique, le dossier "temp" utilisé n'est pas forcément le même. J'ai réglé cette question en modifiant mon appel à CVS, et certaines erreurs n'apparaissent plus, c'est déjà ça de pris.

    - Mon log de sécurité contient énormément de messages "Audit Failure" et cela ne me semble pas normal.

    Bizarrement, en lançant la tâche en "manuel", j'ai aussi eu ce blocage hier, ce qui ne m'était plus arrivé depuis longtemps, c'est embêtant, mais l'avantage est que j'ai une console PoSH "moisie" pour investiguer, je ne pars pas de rien.

  10. #10
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Je crois que j'ai trouvé un "tricky fix". Je ne vais pas crier victoire trop tôt, mais pour le moment, ça semble fonctionner.

    C'est vraiment un "tricky fix" : je reboote automatiquement la machine 15 mn avant de lancer mon script de build.

    Si vraiment ça marche comme cela, ben je vais laisser, sinon j'ai d'autres pistes pour changer mon script, mais ça va me demander pas mal de boulot.

  11. #11
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Bon mon histoire de reboot ne règle pas définitivement le problème, j'en profite pour te répondre plus précisément.

    Citation Envoyé par Laurent Dardenne Voir le message
    Je compatis.
    As-tu réfléchi à un autre moyen pour déclencher ton traitement ?
    un service, WMI ?
    Je sais pas faire. T'as des liens là dessus ?

    Citation Envoyé par Laurent Dardenne Voir le message
    Que fait ton traitement si tu exécutes uniquement CVS sans toute la mécanique de job, juste un start-process ?
    C'est là dessus que je vais partir, mais ça me change beaucoup de choses dans le traitement des logs. Comme tu ne peux que rediriger dans des fichiers, ben plus d'horodate précis, plus de traces complètes avec imbrications des logs et erreurs...

    Mais j'ai pas le choix, c'est encore la voie la plus simple.

    Citation Envoyé par Laurent Dardenne Voir le message
    As-tu recherché/poster dans les forums de support CVS ?
    As-tu consulté MSConnect au sujet du scheduler ?

    Sinon demander dans le forum prog Win32.
    CVS n'est plus Open Source maintenant, mais même avec une version d'essai de la dernière version, c'est pareil. Et pour accéder à leur forum, faut acheter, pas glop ça.

    Pour connect, je vais probablement aller enrichir mon bug report.

    Merci.

  12. #12
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    Toujours là Laurent ? c'est aussi ouvert aux autres, que je sois pas le seul à souffrir

    Bon, j'ai switché mon script pour utiliser Start-Process au lieu de l'écriture précédente et ça pose un énorme problème qui n'est pas lié à CVS.

    Avec Start-Process, ça marche pas si mal, je lance mon script à main ou via l'interface web du PC, et je peux builder un projet témoin en 2 mn environ, pas mal.

    Mais si je laisse mon script se lancer tout seul, alors le même projet témoin se buildera en... 20 mn environ, sans RIEN changer au script. Et ça touche tous les appels de process externes qui sont dramatiquement ralentis...uniquement quand le script est appelé depuis un tâche programmée.

    J'y comprends rien, mais ma liste de projets qui normalement se build en un peu moins de 6h, là, elle tourne toujours 24 h après, c'est pas acceptable en l'état.

    Donc retour en arrière, je vais saucissonner ma liste pour builder en 3 sessions PoSH, ça devrait passer.

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par romut Voir le message
    Toujours là Laurent ?
    Oui la notification joue son rôle, mais en ce moment dans le journée je suis radioactif, et en soirée juste actif
    Citation Envoyé par romut Voir le message
    c'est aussi ouvert aux autres, que je sois pas le seul à souffrir
    Le souci pour t'aider est peut être là, tu es le seul à disposer de l'environnement et des scripts qui posent pb.
    Citation Envoyé par romut Voir le message
    J'y comprends rien,
    Je suis.
    Et rajoute 10

    Je ne vois pas, en l'état, comment je peux t'aider.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème appel template fonction depuis main()
    Par jilius_m dans le forum Débuter
    Réponses: 1
    Dernier message: 30/08/2014, 13h31
  2. Réponses: 1
    Dernier message: 14/05/2014, 13h38
  3. Problème d'appel d'un EJB Remote depuis une applet
    Par Sirius21 dans le forum Applets
    Réponses: 0
    Dernier message: 17/07/2013, 10h49
  4. Réponses: 6
    Dernier message: 14/05/2010, 16h48
  5. Problème appel WebService IIS depuis Delphi
    Par ludogoal dans le forum Web & réseau
    Réponses: 2
    Dernier message: 27/02/2009, 08h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo