Tcl中检查rsh命令的超时(timeout)

风行水上 @ 2013-01-18 16:04:09
标签:

    执行rsh $host $cmd命令,有可能会遇到无法登录远端机器的情况(比如由于远端机器死掉了)。这时需要一种办法来进行超时判断。而rsh命令本身是没有选项可以指定timeout的。

    下面的例子利用了Tcl事件式编程的特点,显得很优雅。

    proc host::rsh::ping {host {timeout 3}} {
      set ::ok "wait"
      after [expr 1000*$timeout] {set ::ok timeout}
      set fp [open "| rsh $host echo hello " r]
      set ::ok "open"
      fconfigure $fp -blocking 0  ;# important to make it non-blocking
      fileevent $fp readable {set ::ok "ok"}
      vwait ::ok
      close $fp
    
      puts "ok = $::ok"
      return [expr {$::ok=="ok"}]
    }
    

    如果是在其他语言中,也可以利用alarm触发ALRM信号来实现。用Tclx来表示的话,过程如下:

    proc host::rsh::ping {host {timeout 3}} {
      signal trap ALRM {set ::ok timeout}
      alarm 3
      ...
    }
    

    这两种方法都可以看作是有一个timer在起作用。不然的话,就要借助循环语句和sleep命令来实现了。

    这个问题的另一个思路是先检测远端机器的是否可以ping通:

    ping -c 2 $host
    

    或者用netcat命令检查远端机器的rsh端口514是否可以连接:

    /usr/bin/nc -z -w 3 $host 514
    
    标签:

      分享到:
      comments powered by Disqus

      25/29ms