Bash I / O重定向

时间:2015-01-15 15:31:21

标签: linux bash pipe tcl

我当前任务的主要问题是从Tcl环境(使用exec cmd。)启动进程,I / O重定向到父进程(Tcl),当父进程意外停止时,我想自动停止子进程。但有一点需要注意:对于I / O重定向案例,子进程不会停止。问题很复杂,因为无法修改子进程。

我找到了下一个线程How to make child process die after parent exits?,其中找到了C语言的解决方案,没有I / O重定向。

例如,我在Tcl中使用下一个命令:

exec ping $SERVER_NAME >@ stdout 2>@ stderr

此命令将stdout和stderr的输出重定向到父进程(Tcl)。 但我需要运行类似的东西:

exec sh -c "set -o monitor; ping $SERVER_NAME >@ stdout 2>@ & read dummy; kill %1"

在上面的命令中,stdout和stderr的输出进入“sh”进程,但我想在我的父进程中得到它。所以我有几个问题:

  1. 以下命令中的符号“@”是什么意思(可能是您可以获得链接)?
  2. 如何将I / O重定向到Tcl进程?
  3. 如果Tcl进程意外停止,如何停止子进程(例如ping)?

1 个答案:

答案 0 :(得分:0)

>@ stdout的含义是将命令的输出发送到Tcl进程的标准输出而不收集它。 2>@ stderr的含义是将命令的标准错误流发送到Tcl进程的标准错误而不收集它(如果它收集了非空的东西,则会导致错误)。考虑在子进程调用中复制它,即使在bash中,也会让我受伤!我怀疑你不能这样做。

这样处理可能更容易:

set pid [exec exec ping $SERVER_NAME >@ stdout 2>@ stderr &]

# and when you want to stop it...
exec kill $pid

执行更完整的工作需要使用TclX软件包的signal命令。