Voici un morceau très simple de code pour faire la pinging dans la fond en ouvrant un pipeline. Pour ce faire, faire le premier caractère du « nom de fichier » à open
être un |
, quand le reste du « nom » est interprété comme une liste Tcl des arguments de ligne de commande, comme dans exec
:
proc doPing {host} {
# These are the right sort of arguments to ping for OSX.
set f [open "|ping -c 1 -t 5 $host"]
fconfigure $f -blocking 0
fileevent $f readable "doRead $host $f"
}
proc doRead {host f} {
global replies
if {[gets $f line] >= 0} {
if {[regexp "Reply from $host" $result]} {
# Switch to drain mode so this pipe will get cleaned up
fileevent $f readable "doDrain $f"
lappend replies($host) 1
incr replies(*)
}
} elseif {[eof $f]} {
# Pipe closed, search term not present
lappend replies($host) 0
incr replies(*)
close $f
}
}
# Just reads and forgets lines until EOF
proc doDrain {f} {
gets $f
if {[eof $f]} {close $f}
}
Vous devrez également exécuter la boucle d'événement. Cela peut être trivial (vous utilisez Tk) ou peut être nécessaire (vwait
) mais ne peut pas être intégré dans ce qui précède. Mais vous pouvez utiliser une astuce pour exécuter la boucle d'événements assez longtemps pour recueillir tous les résultats:
set hosts 172.35.122.18
set replies(*)
foreach host $hosts {
for {set i 0} {$i < 20} {incr i} {
doPing $host
incr expectedCount
}
}
while {$replies(*) < $expectedCount} {
vwait replies(*)
}
Ensuite, il suffit de regarder le contenu du tableau replies
pour obtenir un résumé de ce qui est arrivé.
Pour quoi avez-vous spécifiquement besoin d'aide? –
@Luke Je suis à la recherche de script tcl qui va ping sur le serveur distant avec plus de 20 requêtes ping en même temps sans ouvrir un autre tclsh.exe. – user16691