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 :

Recherche utilitaires timeout + processus fils


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Billets dans le blog
    1
    Par défaut Recherche utilitaires timeout + processus fils
    Bonjour,

    Connaissez vous un utilitaire en ligne de commande qui puisse permettre de lancer un process avec un timeout ? Quelque chose sous la forme

    TimeoutedStart time command

    Egalement, connaissez vous un utilitaire en ligne de commande permettant de hierarchiser les processus enfants et parents à la manière de processexplorer de chez sysinternals ? J'aimerai par ce biais réccupérer l'ensemble des processus enfant lancé par mon processus père.

    Cdlt,
    John.

  2. #2
    Membre chevronné

    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2003
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 333
    Billets dans le blog
    1
    Par défaut
    Bon après quelques heures de recherche, je poste ce que j'ai trouvé :

    L'API windows en charge de la gestion des process se nomme Win32_Process. Ca c'est si on veut l'aborder directement via un langage de haut niveau (cherchez pour les parents id du côté de CreateToolhelp32Snapshot(), Process32First/Next, PROCESSENTRY32.th32ParentProcessID.). Un exemple d'implémentation en VB6 ici : http://vbnet.mvps.org/index.html?cod...entprocess.htm. Un autre utilisant une autre méthode ici : http://www.codeguru.com/cpp/w-p/win32/article.php/c1437.

    Pour ce qui est du scripting, on peux utiliser par WMI. Un exemple ici en VBS :

    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
    'All properties : http://msdn.microsoft.com/en-us/library/aa394372%28VS.85%29.aspx
    Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process")
    For Each objItem in colItems
    	WScript.Echo "Process ID : " & objItem.ProcessId
    	WScript.Echo "Process NAME : " & objItem.Name
    	WScript.Echo "Process CMD : " & objItem.CommandLine
    	WScript.Echo "Process EXE : " & objItem.ExecutablePath
    	WScript.Echo "Parent Process ID : " & objItem.ParentProcessId
    	WScript.Echo "Caption : " & objItem.caption
    	WScript.Echo "CreationDate : " & objItem.CreationDate
    	WScript.Echo "Priority : " & objItem.Priority
    	WScript.Echo "SessionId : " & objItem.SessionId
    	WScript.Echo "Status : " & objItem.Status
    Next


    Pour la date de création, le +60 correspond au delta pour rejoindre le temps UTC. Des infos sur le décalage peuvent être facilement trouvé via la commande w32tm



    On peux utiliser le script suivant pour obtenir/convertir des temps local en UTC, via VBS : UTC.vbs. Notez que la version sur le site de Ms est buggué, vous devez commenter la premiere ligne, option explicit pour que cela fonctionne. Je n'ai pas trouver de commande ou de script pour obtenir directement le temps utc au format en milisecondes par contre.



    En programmation dure, les classes suivantes seront utiles :
    GetSystemTime Function
    GetLocalTime Function
    UtcNow

    Il suffirai d'ajouter à la requête la clause WHERE Name='cmd.exe' pour filtrer l'ensemble des résultats aux seules images cmd.exe.

    Toujours dans la même veine, un autre exemple en VBS pour lancer un processus et obtenir son PID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    'http://msdn.microsoft.com/en-us/library/aa389388%28VS.85%29.aspx
    Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
    Const SW_NORMAL = 1
    strCommand = "Notepad.exe" 
    Set objStartup = objWMIService.Get("Win32_ProcessStartup")
    Set objConfig = objStartup.SpawnInstance_
    objConfig.ShowWindow = SW_NORMAL
    Set objProcess = objWMIService.Get("Win32_Process")
    intReturn = objProcess.Create (strCommand, Null, objConfig, intProcessID)
    If intReturn <> 0 Then
        Wscript.Echo "Process could not be created." & vbNewLine & "Command line: " & strCommand & vbNewLine & "Return value: " & intReturn
    Else
        Wscript.Echo "Process created." & vbNewLine & "Command line: " & strCommand & vbNewLine & "Process ID: " & intProcessID
    End If
    On peux aussi trouver quelques commandes relatives :

    Les bien connue taskkill.exe et tasklist.exe sont natives à windows mais ne donnent pas d'informations détaillées qui puisse nous être utiles pour la gestion des parents ou des timeouts.

    Côté sysinternal, pslist.exe -t affiche la même vue que process explorer (toujours de chez systinternal). Le problème c'est que la hiérarchie est difficilement traitable en script, du fait de sa représentation graphique avec des espaces.



    NTParent envoie le PID parent du pid donnée ou -1 si il n'existe pas/ne le trouve pas :





    Avec l'ensemble des informations données ci dessus, il est possible de trouver les processus enfants d'un processus donnés et plus.

    Côté timeout, j'ai trouvé quelques réponses. Il n'existe pas d'équivalent de alarm (unix) sous windows à ma connaissance. Par contre chaque processus peux renvoyer sa date de création et/ou son temps d'existence.

    Plist de sysinternal vous donne la durée de vie du process, par un simple calcul de date vous pouvez donc déterminer sa création :



    à partir de là, il suffit pour programmer un timeout d'utiliser une commande sleep puis de vérifier l'existence du PID renvoyé à la création de la tâche, ainsi que sa date de création.

    Le script VBS précédement donné indique également directement la date de création du processus, pratique. C'est aussi le seul à donner une heure de création suffisament précise pour distinguer des executions parallèles :



    Oubliez l'utilisation de la variable %time% en batch pour réccupérer avec précision l'heure de lancement :




    La commande process viewer donne une heure de creation plus lisible :



    mais pas assez précise dans le cas d'execution parallèles :



    L'executable Plist de sysinternal est dans le même cas :



    Il existe un executable sachant lancer des exécutables et les tuer sur indication de timeout : BeyondExec. Par contre, tout comme psexec de sysinternals, un service est crée sur la machine (et reste en état manuel aprés execution, ce qui n'est pas terrible), il faut donner à chaque fois l'adresse IP local pour une execution en local. Mais ça marche :



    Il est même possible de lancer plusieurs processus en parallèle sans attendre avec l'option -w mais le résultat n'est pas très probant (à moins d'espacer chaque appel de quelques secondes, mais on perd en précision) :



    Une autre possibilité est d'utiliser la fonction exec en VBScript qui permet d'attacher un thread par processus et ensuite d'utiliser un sleep toutes les X secondes pour vérifier si le thread existe encore ou pas.

    Pour terminer, il existe un outil capable de tuer les applications par nom de fenêtre cette fois, au bout d'un certain temps : exitdelay. Pas forcément la panacé, mais ça peut toujours être utile. L'outil repère les handles de fenêtre contenant le titre en question et les tuent aprés le délai spécifiez, en minute.


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

Discussions similaires

  1. Executer commande dans un processus fils !
    Par jérôme.D dans le forum POSIX
    Réponses: 6
    Dernier message: 23/11/2006, 22h14
  2. Tuer processus fils
    Par lornak dans le forum POSIX
    Réponses: 7
    Dernier message: 29/05/2006, 10h00
  3. terminaison du processus fils
    Par zahira dans le forum POSIX
    Réponses: 3
    Dernier message: 08/04/2006, 13h35
  4. Partage d'une variable entre les processus fils
    Par Mehdi Feki dans le forum Linux
    Réponses: 7
    Dernier message: 09/01/2005, 13h34

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