Bash从给定的PID中读取Stdin

问题描述 投票:1回答:2

我有一个关于Linux的问题,尽管Bash的答案是最佳的。如何从脚本中读取给定进程的stdin / stdout / stderr(通过PID)?换句话说,如何从脚本中获取另一个程序的stdin / stdout / stderr?我还没有在其他地方找到任何答案。

到目前为止,我已经能够找到进程ID

pidof {some-process-name}

然后找到它的stdin套接字的位置(我认为这就是所谓的...)

readlink -f /proc/{PID}/fd/0

通常会产生类似的东西

/dev/pts/1

然后我可以写到该标准输入

echo "Hello World" > /dev/pts/1

但是试图从那个套接字读取

cat /dev/pts/1

或者从原始文件

cat /proc/{PID}/fd/0

即使在进程终止之后,两者都不产生任何东西,只是无限期地等待,因此文件被删除。

任何帮助将非常感激。先感谢您!

更新:找到解决问题的方法,请参阅下面的答案。

linux bash stdin pid
2个回答
1
投票

启动后,您无法与程序的文件描述符进行交互。 /proc/$pid/fd/中的条目只是告诉您文件描述符的连接位置 - 您可以写入连接到stdout的位置,并找出它从哪里读取stdin,但不能更改它们连接到的位置或将新数据注入任何这些流。

一个常见的解决方法是在一个支持这些操作(expecttmux等)的工具下运行程序,但当然需要在启动程序时进行。


0
投票

好的,经过大约一天的实验,我设法做到了。读取流可以在/proc/{PID}/fd/0或文件链接的任何内容上工作(如我的问题中所述,使用readlink找到)。每次将某些内容输入到程序的stdin中时,读取流都会产生结果。对于我的测试,它似乎只适用于键盘,而不是用echo "Hello World" > /dev/pts/1粗略模拟的击键尽管如此,它足以满足我的目的。感谢所有其他人指出我正确的方向!

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