gpt4 book ai didi

java - 使用标准输入通过/proc/{pid}/fd/0 向 java -jar 发送命令

转载 作者:IT王子 更新时间:2023-10-29 01:22:09 25 4
gpt4 key购买 nike

我正在尝试使用/proc/{pid}/fd/0 向 minecraft 服务器 jar 发送命令,但服务器不执行该命令。

要复制我正在尝试做的事情,您可以在基于 Debian 的机器上执行此操作(也可能是其他 Linux 发行版)。

我用什么来测试这个:

  • Ubuntu 14.04
  • minecraft_server.jar (用 1.8 测试)
  • OpenJDK 运行时环境(安装有 default-jre-headless)

第一个控制台:

$ java -jar minecraft_server.jar nogui

响应:[ ... 服务器启动并等待输入]

say hi

响应:[19:52:23] [服务器线程/信息]:[服务器] 嗨

第二个控制台:

现在,当我切换到第二个控制台时,服务器仍在第一个控制台中运行,我写道:

echo "say hi2" >> /proc/$(pidof java)/fd/0

在我切换回第一个控制台之前,一切看起来都很好。我可以看到文本“say hi2”,但服务器尚未识别它。我可以在第一个控制台中再次编写另一个命令,就好像从第二个控制台输入的文本根本不存在一样。

这是为什么?更重要的是,如何以正确的方式使用/proc/{pid}/fd/0 将命令发送到 java jar 文件?

我不知道这是否是我不知道的某种 Java 事物,我是否可以在执行服务器时使用一些标志或其他东西,或者问题是否出在服务器 jar 本身上。 .

我知道您可以使用 screen、tail -f 或某种服务器包装器来完成此操作,但这不是我想要的。我想以某种方式使用此方法发送命令。

最佳答案

这不是 Java 的事情。您正在尝试的根本不可行。

这样测试:

控制台 1:

 $ cat

这基本上会在您点击“返回”后立即回显您在其上键入的任何内容。

控制台 2:找到您的 cat 命令的进程号。假设它是 NNN。做:

$ echo Something > /proc/NNN/fd/0

切换回控制台 1。您会在控制台输出中看到“Something”,但没有回显。

为什么?做

$ ls -l /proc/NNN/fd

你可能会明白。所有三个描述符,0 代表 stdin,1 代表 stdout 和 2 代表 stderr 实际上是符号链接(symbolic link),并且都指向同一个伪终端从属( pts) 设备,这是与您的第一个终端关联的 pts。

所以基本上,当你写入它时,你实际上写入了控制台输出,而不是它的输入。如果您从该文件中读取,您可能会窃取一些本应进入第一个控制台中的进程的输入(您正在争夺此输入)。这就是字符设备的工作原理。

/proc 的文档说:

/proc/[pid]/fd/

This is a subdirectory containing one entry for each file which the process has open, named by its file descriptor, and which is a symbolic link to the actual file. Thus, 0 is standard input, 1 standard output, 2 standard error, and so on.

所以这些不是进程打开的实际文件描述符。它们只是指向文件(或在本例中为字符设备)的链接,其名称表明它们在给定进程中附加到哪个描述符。它们的主要职责是告诉您进程是否已重定向其文件描述符或是否打开了任何新文件描述符,以及它们指向哪些资源。

但是如果您想要一种替代方法,您可以使用 fifo - 命名管道。

通过以下操作创建一个 fifo:

$ mkfifo myfifo

运行你的java程序:

$ java -jar minecraft_server.jar nogui < myfifo

打开另一个控制台。写

$ cat > myfifo

现在开始输入内容。切换到第一个控制台。您会看到您的服务器正在执行您的命令。

不过,请注意您的文件结尾。多个进程可以写入同一个 fifo,但一旦最后一个进程关闭它,您的服务器将在其标准输入上收到 EOF。

关于java - 使用标准输入通过/proc/{pid}/fd/0 向 java -jar 发送命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26765035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com