退出TCL假挂

时间:2015-09-02 11:05:53

标签: tcl exec stdout hang stderr

简单TCL挂起

我使用非常简单的TCL脚本来重现我的问题。我使用activeTCL 8.6.4.1在Windows 7上运行。 我使用一个简单的批处理文件(loop.bat)在循环中调用tcl脚本(1.tcl)。然后该脚本执行一些“puts”并打开另一个TCL shell来调用另一个TCL脚本(2.tcl)。第二个脚本执行两个“puts”,一个在stdout上,一个在stderr上,然后返回。

为了重现这个问题,我启动了16个loop.bat实例并让它运行一整夜。当我早上回来时,大约一半的实例停滞不前(挂起)。

以下是我使用的代码:

Loop.bat

@echo off
:loop
tclsh86 1.tcl
goto loop

1.tcl

puts "start 1.tcl"
set error [catch {eval {exec tclsh86 2.tcl >@stdout 2>@stderr}} results]
puts "error = $error"
puts "results = $results"
puts "end 1.tcl"
return 0

2.tcl

puts stdout "Print to stdout from 2.tcl."
puts stderr "Print to stderr from 2.tcl."
return 1

2 个答案:

答案 0 :(得分:1)

  

为了重现这个问题,我启动了16个loop.bat实例并让它运行一整夜。当我早上回来时,大约一半的实例停滞不前(挂起)。

有新的线程和文件套接字创建了迭代的'exec',' puts'地址和批处理循环。如果创建的套接字或线程比恢复它们的速度快,则调用的“&”按钮将被删除。进程最终会耗尽可用的套接字或线程。

这可能有助于解释:https://blogs.msdn.microsoft.com/oldnewthing/20050729-14/?p=34773

答案 1 :(得分:0)

一种解决方案可能是使Windows对进程具有更多控制权,并使用start执行tclsh86

@echo off
:loop
start /b /wait tclsh86 1.tcl
goto loop

这可能会解决问题。每次启动tclsh86时,'/ b'禁止创建新的控制台。