TCL 等待 exec 后台作业完成

TCL wait for exec background job to finish

我如何收到通过 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."

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

非常感谢您的反馈。

最好的, 格特

在 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