Bash 从给定 PID 读取标准输入
Bash Read Stdin from Given PID
我有一个关于 Linux 的问题,尽管 Bash 的答案是最佳的。如何从脚本中读取给定进程(通过 PID)的 stdin/stdout/stderr?换句话说,如何从脚本中获取另一个程序的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 找到)。每次在程序的标准输入中键入内容时,读取流都会产生一个结果。对于我的测试,它似乎只适用于键盘,而不适用于用 echo "Hello World" > /dev/pts/1
粗略模拟的击键。尽管如此,它对我的目的来说已经足够了。感谢所有其他人为我指明了正确的方向!
我有一个关于 Linux 的问题,尽管 Bash 的答案是最佳的。如何从脚本中读取给定进程(通过 PID)的 stdin/stdout/stderr?换句话说,如何从脚本中获取另一个程序的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 找到)。每次在程序的标准输入中键入内容时,读取流都会产生一个结果。对于我的测试,它似乎只适用于键盘,而不适用于用 echo "Hello World" > /dev/pts/1
粗略模拟的击键。尽管如此,它对我的目的来说已经足够了。感谢所有其他人为我指明了正确的方向!