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