9

谢谢!我的用户案例:我开始了一个冗长的交互式“配置”过程(比如在“屏幕”下),然后意识到我需要始终回答“不”,直到我看到一个特定的关键字。手动做这件事似乎浪费时间(不是说我很容易错过关键字..)

因此,似乎我想将 STDERR / STDOUT 的(副本)传送到过滤器,并且还能够在启动后使用命令行注入(控制台)进程的 STDIN?有现成的解决方案吗?

以下工具似乎有帮助。要捕获输出,请使用

strace -ewrite -p $PID

它不是那么干净(显示如下行: write(#,) ),但有效!但它是否说正确处理 UTF8?

要重定向输出,请执行以下操作

printf '..input..' >/dev/pts/33

但目前尚不清楚如何找到合适的设备..

4

3 回答 3

6

在 Linux 中解决(显然是特定于 Linux 的):

reptyr -s PID 

将进程附加到另一个终端和/或将其输入和输出公开为管道。

于 2012-02-04T18:44:24.253 回答
3

这是可能的,但它并不漂亮。过程如下:

  1. 用于gdb附加到已经运行的进程
  2. 运行您要更改的文件描述符p close(<fd>)在哪里<fd>
  3. 运行p creat("<path to file">, <perms>)以将关闭的输出发送到fd其他地方

请参阅此链接了解更多详细信息

于 2012-01-28T20:16:15.837 回答
1

你为什么要那样做??

以可移植的 Posix-ly 方式是不可能的!也许open-/proc/1234/fd/0/proc/1234/fd/1/proc/1234/fd/3伪文件(用于进程 1234)可能是一个丑陋的可能性!甚至在某些情况下也可能不起作用(例如管道)。

特别是,我相信SIGPIPE如果没有人在读取管道,发送到进程的语义会被破坏......

而且我不相信您能够保持例如stdout的伪 tty 质量。

所以基本上,你最好找到一种不同的方法来实现你的总体目标,你没有明确解释。

如果您的用例是一些奇怪的configure脚本,您可以重新启动它并用您自己的一些脚本(在 shell、python、perl 等中)提供它。不要浪费时间尝试捕捉现有configure进程,只需适当地重新启动它即可。

还要查看screen 命令(以及它是如何实现的!)

于 2012-01-28T19:11:56.347 回答