1

ping コマンドを呼び出して応答を返す Tcl コードがあります。コードは次のとおりです。

proc ping-igp {} {
foreach i {
127.0.0.1
200.200.200.1
} {
if { [regexp "0% loss"  [eval exec "ping $i -n 1" ]]} { puts “$i”} else { puts “$i  failed” }
}
}

しかし、実行中に次のようにo/pを取得します。

% proc ping-igp {} {
foreach i {
127.0.0.1
200.200.200.1
} {
if { [regexp "0% loss"  [eval exec "ping $i -n 1" ]]} { puts "$i"} else { puts "
$i  failed" }
}
}
% ping-igp
"127.0.0.1"
Pinging 200.200.200.1 with 32 bytes of data:
Request timed out.
Ping statistics for 200.200.200.1:
Packets: Sent = 1, Received = 0, Lost = 1 (100% loss),
child process exited abnormally
%

200.200.200.1 に ping を実行できないときに、コードが else 句を処理せず、最後に o/p "200.200.200.1 failed" を返す理由を知りたいです。私は「0%損失」に一致しています

多くのサンクス。

4

3 に答える 3

3

エラーが返された場合に備えて、ping への exec 呼び出しをキャッチする必要があります。これは、catch を使用するように変更されたコードです。

proc ping-igp {} {
foreach i {
  127.0.0.1
  200.200.200.1
} {
if {[catch {exec ping $i -n 1} result]} { set result 0 } 
if { [regexp "0% loss"  $result]} { puts "$i"} else { puts "$i  failed" }
}
}

実行すると、次のようになります。

% ping-igp
127.0.0.1
200.200.200.1  failed
%
于 2012-09-21T09:10:21.843 に答える
1

これは、私が自分で使用するために作成したものです。Tcl の ping プロシージャです。完璧ではありませんが、機能します:

package require Tclx; # Needed for lassign and wait

# Pings a host and returns 0 if OK, non-zero otherwise
proc ping {host} {
    # TODO: Use different command for Windows OS
    set childPid [exec ping -c 1 $host > /dev/null 2>@1 &]
    lassign [wait $childPid] pid howItEnded exitCode
    return $exitCode
}

# Test the ping proc
set hostList {google.com 10.0.0.99 foo.bar}
foreach host $hostList {
    set code [ping $host]
    puts [format "%4d %s" $code $host]
}

出力例:

$ tclsh ping_test.tcl 
   0 google.com
   2 10.0.0.99
  68 foo.bar
于 2012-09-21T16:51:35.767 に答える
0
proc ping_device { router ip_address max_tries } {
    set tries 0    
    while {$tries <= $max_tries} {
        if {[catch {exec ping $ip_address -c 5} result]} { 
            puts "Ping command failed on Linux machine"
            incr tries
            if {$tries > $max_tries} {
                ats_log -error "Giving up on ping"
                return 0
            }
            continue
        } 
        if {[regexp {([1-5]+) *[packets]? *received} $result - packets]} { 
            puts "Able to ping device: $router and\
                           successfully received $packets packets"
            return 1
        } else { 
            puts "Not Able to ping device: $router"
            incr tries
        }
    }
    puts "Giving up on ping, returning 0"
    return 0
}
于 2013-02-05T21:53:40.807 に答える