执行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