2013-08-12 5 views
0

Dans mon script TCL, j'exécute un processus qui peut être réexécuté après la fin du test. Cependant, il y a une période d'attente de 40 secondes pour laisser suffisamment de temps au programme pour démarrer. Si le programme fonctionne, je ne veux pas avoir cette période d'attente de 40 secondes. Est-il de toute façon à rechercher et lire la liste des tâches pour déterminer si le programme est en cours d'exécution? Je pensais au PID mais cela change chaque fois que j'exécute le programme, probablement parce qu'il est placé dans une autre zone de mémoire.Déterminez si le processus est en cours d'exécution

J'ai un fichier séquentiel écrit qui fait ce processus, mais alors je devrais retourner le résultat dans TCL. Y a-t-il un moyen de le faire?

+0

Possible, utilisez [twapi] (http://twapi.magicsplat.com/). –

Répondre

2

Si vous n'avez pas twapi, voici une alternative: utiliser tasklist.exe:

package require csv 

proc getPids {imageName} { 
    set noTaskMessage "INFO: No tasks are running which match the specified criteria." 
    set output [exec tasklist.exe /fi "imagename eq $imageName" /fo csv /nh] 
    set pidList {} 
    if {$output != $noTaskMessage} { 
     foreach line [split $output \n] { 
      set tokens [::csv::split $line] 
      lappend pidList [lindex $tokens 1] 
     } 
    } 
    return $pidList 
} 

# Try it out 
set imageName chrome.exe 
set pids [getPids $imageName] 
if {$pids == ""} { 
    puts "Process $imageName is not running" 
} else { 
    puts "PIDs for $imageName: $pids" 
} 

Discussion

  • Le doit "Nom d'image" comprennent l'extension (par exemple chrome.exe)
  • L'indicateur /fi spécifie un filtre, dans ce cas, nous voulons filtrer par nom d'image
  • L'indicateur /fo spécifie la sortie f oumat: TABLE (par défaut), LIST et CSV. Je choisis CSV parce que c'est le plus facile à analyser.
  • Le /nh indique à tasklist.exe d'omettre l'en-tête (aucun en-tête AKA). Si getPids renvoie une liste vide, le processus n'est pas en cours d'exécution.
  • getPids peut renvoyer plusieurs PID, vous devez donc pouvoir gérer ce cas.
+0

Bien pensé et merci pour les informations supplémentaires concernant les drapeaux et leurs buts! – ButtahNBred

1

Oui, c'est possible, mais vous avez besoin d'une extension Tcl: Twapi.

Pour vérifier si un processus est en cours d'exécution, vous pouvez essayer de trouver un processus avec un nom spécifique. vous pouvez utiliser le ceci:

package require twapi 
if {[llength [twapi::get_process_ids -name YOUR_EXECUTABLE.EXE]]} { 
    puts "Process is currently running" 
} else { 
    puts "Process not running" 
} 

Voir la manual about twapi::get_process_ids pour plus d'informations.

Si vous avez besoin d'une notification quand un processus démarre/s'arrête, ce sera plus compliqué et je dois le rechercher.

0

dans le cas particulier où vous avez la chance, de lire le programme a commencé (ou écrire au programme si ce lit de son stdin), vous pouvez commencer le processus avec ouverture

set descriptor [open "|myprogram" r] 

puis avec détecter eOF lorsque le tuyau se ferme (qui implique que vous devez lire les données de ce canal en utilisant par exemple « lire »)

peut-être vous pouvez écrire un wrapper autour de votre programme. Ce wrapper peut envoyer à stdout et permet à l'appel tcl-Script de détecter la fin du programme.

Questions connexes