TCL 实例: 让一个命令运行一定的时间‏

上一篇 / 下一篇  2009-07-06 21:59:31 / 个人分类:TCL

[root@ntp tcl]# vi timed-run.tcl

exec tclsh "$0" ${1+"$@"}

#
# run a program for a given amount of time,
# aborting after the number of seconds
#
# Usage:
# tclsh timed-run.tcl 20 long_running_program  program_args
#
# Author: Jeff Hobbs, based off shorter example by Don Libes
#

# This is required to declare that we will use Expect
package require Expect

proc usage {} {
    puts stderr "usage: $::argv0 <timeInSecs> <program>  <program args> "
    exit 1
}


if {$argc < 2} { usage }

# timeout value is first to be passed in
set timeout [lindex $argv 0]
if {![string is integer -strict $timeout]} { usage }

# program and args are the rest
set cmd [lrange $argv 1 end]

# invoke the cmd with spawn
eval spawn $cmd

# just call expect and wait for it to timeout or eof to occur
expect




运行结果:

[root@ntp tcl]# ./timed-run.tcl
usage: ./timed-run.tcl <timeInSecs> <program>  <program args>

以下调用 vmstat 运行时间长1秒,自然退出
[root@ntp tcl]# ./timed-run.tcl  9 vmstat
spawn vmstat
   procs                      memory      swap          io     system      cpu
 r  b  w   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id
 0  0  0      0 835304  43340  90120    0    0     0     4   83    40  0  0 100

以下调用 vmstat 运行时间长9秒,超时退出
[root@ntp tcl]# ./timed-run.tcl  9 vmstat 1
spawn vmstat 1
   procs                      memory      swap          io     system      cpu
 r  b  w   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id
 1  0  0      0 835304  43340  90120    0    0     0     4   83    40  0  0 100
 0  0  0      0 835304  43340  90120    0    0     0     0 1019    33  0  0 100
 1  0  0      0 835300  43340  90120    0    0     0     0 1024    48  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0   272 1046    88  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0     0 1029    57  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0     0 1035    59  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0     0 1048    91  1  1 98
 0  0  0      0 835980  43340  90108    0    0     0     0 1031    51  0  0 100
 0  0  0      0 835980  43340  90108    0    0     0    12 1023    54  0  0 100
 1  0  0      0 835980  43340  90108    0    0     0     0 1016    38  0  0 100
[root@ntp tcl]#


[root@ntp tcl]# cat timed-run.tcl
#!/bin/sh
# \
exec tclsh "$0" ${1+"$@"}
优点:
1,二进制文件的位置不需要填入,它可以在你的 shell 查找路径中的任何地方。
2,突破了#!只有30个字符的限制
3,再shell中, 第2行是注释,第3行不是.但是在tcl中, \是连接符号,下一行依旧是注释.所以只有shell有机会执行第3行.exec语句导致 shell 停止处理而启动 tclsh 来重新处理整个脚本。当 tclsh启动时,因为第二行的反斜线导致第三行被作为第二行注释的一部分,它把所有三行都作为注释对待。


exec tclsh "$0" ${1+"$@"}
很多地方是这样表达:
exec wish "$0" "$@"

[root@ntp tcl]# vi test

#!/bin/sh
# \
echo hello
echo $0
echo ${1+"$@"}
echo "$@"

[root@ntp tcl]# ./test 1 2 3
hello
./test
1 2 3
1 2 3

可见两者没有太大的区别.

$::argv0 应该是TCL在双引号中调用系统参数的方法?

TAG:

 

评分:0

我来说两句

日历

« 2024-05-03  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 30867
  • 日志数: 37
  • 建立时间: 2008-07-09
  • 更新时间: 2009-07-23

RSS订阅

Open Toolbar