如何优雅地杀死无响应的tcl脚本?

时间:2013-11-14 05:24:54

标签: timeout tcl

假设我有一个tcl脚本,通常应该在不到一分钟的时间内执行 - 我怎样才能确保脚本永远不会超过'x'分钟/秒来执行,如果是,那么脚本应该只是停下来。

例如,如果脚本耗时超过100秒,那么我应该能够自动将控制切换到一个清理函数,该函数可以优雅地结束脚本,这样我就可以运行脚本中的所有数据,但是我也确保它不会花太长时间或无限制地卡住。

我不确定这是否可以在tcl中完成 - 欢迎任何帮助或指示。

2 个答案:

答案 0 :(得分:4)

使用子解释器时可以使用interp limit

请注意,这会抛出一个无法访问的错误,如果你想要进行一些清理,你可以删除父interp中的限制。

set interp [interp create]
# initialize the interp
interp eval $interp {
     source somestuff.tcl
}
# Add the limit. From now you have 60 seconds or an error will be thrown
interp limit $interp time -seconds [clock seconds] -milliseconds 60000
set errorcode [catch {interp eval {DoExpensiveStuff}} res opts]
# remove the limit so you can cleanup the mess if needed.
interp limit $interp time -seconds {}
if {$errorcode} {
    # Do some cleanup here
}
# delete the interp, or reuse it?
interp delete $interp
# And what shall be done with the error? Throw it.
return -options $opt $res

资源限制是Tcl的最佳选择,但它们不是防弹的。 Tcl不能(也不会)中止C程序,并且有一些方法可以让Tcl核心做一些努力工作。

答案 1 :(得分:0)

必须有一个你担心可能需要超过100秒的循环,是吗?在进入循环之前保存clock seconds(当前时间),并在每次迭代结束时再次检查时间以查看是否已超过100秒。

如果由于某种原因不可能,你可以尝试使用after设计一些东西 - 也就是说,启动一个定时器来设置(或取消设置)你执行代码知道的一些全局变量的回调 - 所以在检测时,它可以尝试退出。