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