TCL等exec后台工作完成

时间:2015-02-25 20:29:18

标签: tcl exec pid

如何获得通过exec在TCL中启动的作业已完成的通知?

set pid [ exec job & ]
while {<some_magic>} {puts "" waiting for $pid to finish ; sleep 1}
puts "Job $pid has finished. Now let's collect results."

整个想法是,实际上我想要启动许多工作,然后需要监控它们何时完成。

非常感谢您的反馈。

最佳, 格特

1 个答案:

答案 0 :(得分:4)

在Unix上,exec的结果是进程ID。有各种方法可以检查过程是否存在;其中一个最好的事情是:

set running [file exists /proc/$pid]

但那不便携。 (它适用于Linux和IIRC,Solaris。它不适用于OSX,当然它在Windows上根本没用。)

另一种方法是:

set finished [catch {exec ps -p $pid >/dev/null}]
# Note the inverted sense of result compared with previous code sample

这适用于任何具有ps(即所有这些)的Unix以及ps接受-p表示“只是谈论以下进程ID”的地方。因此,如果您在BSD上运行(除了OSX,我已对其进行了测试),您可能会遇到问题。 测试它!

除此之外,您还可以使用TclX扩展程序的signal命令来检测SIGCHLD并对其采取行动。


最便携的方法(即适用于Windows和所有Unix)是使用open创建管道,然后使用fileevent来检测进程的终止。有关详细信息,请参阅此Stack Overflow问题:Detect end of TCL background process in a TCL script