linux - Bash I/O 重定向

标签 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)?

最佳答案

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

关于linux - Bash I/O 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27966968/

相关文章:

mysql - 从 bash 将 blob 字段保存到磁盘

linux - 修改了管道写入的文件

javascript - 将 JSON 对象转换为 pretty-print 的 JSON 的 Angular 2 管道

python - 一个可以被python和shell读取的配置文件

linux - 使用 sudo atom 根本不再打开 Atom,更不用说作为 root 了

linux - 唯一标识文件

linux - 在 Linux nginx 服务器上发布 ASP.NET Core 应用程序

python - 有没有办法捕获结构输出的 shell 命令的集合?

c - 解释 STRACE 输出 - 管道和 fork

linux - 插入排序不起作用,32 位程序集