Bash从给定PID读取Stdin

时间:2018-11-06 07:09:26

标签: linux bash stdin pid

我总体上对Linux有一个疑问,尽管Bash的答案是最佳的。一个人如何从脚本中读取给定进程的stdin / stdout / stderr(通过PID)?换句话说,如何从脚本中获取另一个程序的stdin / stdout / stderr?我到目前为止还无法在其他地方在线找到任何答案。

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

/

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

/c:/Users/avo/test.txt

通常会产生类似的东西

fs.createWriteStream(p)

那我就能写那个标准输入

/

但是尝试从该套接字中读取

pidof {some-process-name}

或者来自原始文件

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

即使在进程终止后,这两个文件都不会产生任何结果,只是无限期地等待,从而删除了文件。

任何帮助将不胜感激。预先谢谢你!

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

好吧,经过大约一天的实验,我设法做到了。读取流可以在/proc/{PID}/fd/0上运行,也可以在文件链接到的任何文件上工作(如我的问题所述,可以通过readlink找到)。每当在程序的标准输入中键入内容时,readstream都会产生结果。对于我的测试,它似乎仅适用于键盘,不适用于使用echo "Hello World" > /dev/pts/1粗略模拟的击键。谢谢所有其他人为我指出正确的方向!