使用命令行捕获进程启动后的STDIN / STDERR / STDOUT?

时间:2012-01-28 18:08:02

标签: linux bash output putty

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

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

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

strace -ewrite -p $PID

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

要重定向输出,请执行类似

的操作
printf '..input..' >/dev/pts/33

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

3 个答案:

答案 0 :(得分:6)

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

reptyr -s PID 

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

答案 1 :(得分:3)

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

  1. 使用gdb附加到已在运行的流程
  2. 运行p close(<fd>)其中<fd>是您要更改的文件描述符
  3. 运行p creat("<path to file">, <perms>)以将已关闭的fd的输出发送到其他地方
  4. 有关详细信息,请参阅This Link

答案 2 :(得分:1)

你为什么要那样做?

以便携式Posix-ly方式无法实现!可能open - /proc/1234/fd/0/proc/1234/fd/1/proc/1234/fd/3伪文件(对于流程1234)可能是一个丑陋的可能性!在某些情况下甚至可能不起作用(例如管道)。

特别是,我相信如果没有人正在阅读管道,那么SIGPIPE发送给流程的语义会被破坏......

而且我不相信你能保持伪tty的质量。 stdout

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

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

另请参阅screen命令(及其实现方式!)