如何获得通过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."
整个想法是,实际上我想要启动许多工作,然后需要监控它们何时完成。
非常感谢您的反馈。
最佳, 格特
答案 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