我有一个关于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
即使在进程终止之后,两者都不产生任何东西,只是无限期地等待,因此文件被删除。
任何帮助将非常感激。先感谢您!
更新:找到解决问题的方法,请参阅下面的答案。
启动后,您无法与程序的文件描述符进行交互。 /proc/$pid/fd/
中的条目只是告诉您文件描述符的连接位置 - 您可以写入连接到stdout的位置,并找出它从哪里读取stdin,但不能更改它们连接到的位置或将新数据注入任何这些流。
一个常见的解决方法是在一个支持这些操作(expect
,tmux
等)的工具下运行程序,但当然需要在启动程序时进行。
好的,经过大约一天的实验,我设法做到了。读取流可以在/proc/{PID}/fd/0
或文件链接的任何内容上工作(如我的问题中所述,使用readlink找到)。每次将某些内容输入到程序的stdin中时,读取流都会产生结果。对于我的测试,它似乎只适用于键盘,而不是用echo "Hello World" > /dev/pts/1
粗略模拟的击键尽管如此,它足以满足我的目的。感谢所有其他人指出我正确的方向!