【问题标题】:Bash I/O redirectionBash I/O 重定向
【发布时间】:2015-01-15 15:31:21
【问题描述】:

我当前任务的主要问题是从 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)?

【问题讨论】:

    标签: linux bash pipe tcl


    【解决方案1】:

    >@ 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 命令。

    【讨论】:

    • 抱歉,“set pid [exec exec ping $SERVER_NAME >@ stdout 2>@ stderr &]”不起作用:错误:无法执行“exec”:没有这样的文件或目录
    • @Alexei:尝试删除execs 之一。
    • @Hoodiecrow:是的,我试过了,但在这种情况下不会设置 pid 变量,因为当我停止父进程时,子进程继续工作并且没有返回 exec,所以没有设置 pid .我想知道这个命令中可能还有其他错误吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2010-10-22
    相关资源
    最近更新 更多