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

问题描述 投票:8回答:3

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

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

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

strace -ewrite -p $PID

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

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

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

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

linux bash output putty
3个回答
6
投票

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

reptyr -s PID 

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


3
投票

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

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

有关更多详细信息,请参阅This Link


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命令(以及它是如何实现的!)

© www.soinside.com 2019 - 2024. All rights reserved.