TCL等待exec后台作业完成

TCL等待exec后台作业完成,tcl,exec,pid,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." set pid[exec job&] 当{}{放置“”等待$pid完成时;睡眠1} 放置“作业$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."
set pid[exec job&]
当{}{放置“”等待$pid完成时;睡眠1}
放置“作业$pid已完成。现在让我们收集结果。”
整个想法是,在现实中,我想启动许多工作,然后需要监控它们何时完成

非常感谢您的反馈

最好的,
Gert

在Unix上,
exec
的结果是一个进程ID。有各种方法可以检查进程是否存在;最简单的方法之一是:

set running [file exists /proc/$pid]
set finished [catch {exec ps -p $pid >/dev/null}]
# Note the inverted sense of result compared with previous code sample
但这不是便携式的。(它可以在Linux、IIRC、Solaris上运行,但在OSX上不起作用,当然在Windows上也毫无意义。)

另一种方法是:

set running [file exists /proc/$pid]
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,我在OSX上测试过),您可能会遇到问题。试试看

除此之外,您还可以使用TclX扩展的
信号
命令来检测
SIGCHLD
,并对其进行操作



最可移植的方法(即在Windows和所有Unix上工作)是使用
open
创建管道,然后使用
fileevent
检测进程的终止。有关更多详细信息,请参阅此堆栈溢出问题:

请参阅。如果您已经编写了“ps”解决方案,该解决方案工作正常,但将尝试/proc/$pid。这是一个相当优雅,因为我在centos linux上,它将是好的。谢谢,Gert。[file exists/proc/$pid]这个函数总是返回true,这意味着我的exec进程永远在后台运行?我说得对吗?如果没有,请纠正我