gpt4 book ai didi

java - 从文件中获取 stdin 来控制后台 java 进程

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:15 25 4
gpt4 key购买 nike

我想使用 Ubuntu 在后台运行 Minecraft 服务器,但每次我这样做时它都会停止运行。我还运行 bash 作为我的 shell。

java -Xmx512M -Xms512M -jar minecraft_server.1.8.jar nogui &

当我运行作业时,我首先得到这个。

[1]+  Running   java -Xmx512M -Xms512M -jar minecraft_server.1.8.jar nogui &

然后几秒钟后。

[1]+  Stopped    java -Xmx512M -Xms512M -jar minecraft_server.1.8.jar nogui

后来我发现,如果您将 stdin/stdout/stderr 重定向到某些文件,它将保持“运行”状态。

java -Xmx512M -Xms512M -jar minecraft_server.1.8.jar nogui > out.txt 2> err.txt < in.txt &

它工作得很好,但我想使用 in.txt 文件作为正在运行的 java 进程的输入。当我第一次运行它时,它会执行 in.txt 一次。因此,如果我在 in.txt 中有/stop ,它将停止服务器。但只有一次。我想将命令放入文本文件中并将其传递到我的世界服务器。当进程运行时,该文件将成为我的键盘输入。我知道我可以使用屏幕,但我想看看是否可以使用文件作为输入来运行它。 in.txt 再次成为我的输入。所以我可以做这样的事情。

echo -e "/stop\r" > in.txt   

或者

echo -e "/time set 0\r" > in.txt



另一个兔子洞。

我什至尝试制作自己的 pipe 。这使得我的世界在后台运行。

 mkfifo pipe; 
java -Xmx512M -Xms512M -jar minecraft_server.1.8.jar nogui &> out.txt < pipe &;
cat > pipe

如果我 cat > pipeline 我的提示符会再次出现,但我可以输入命令并将它们作为标准输入执行。因此,如果我执行 /say hi 它就会运行它。惊人的!一个问题。我需要恢复 bash 提示符。如果我使用 Ctrl-C 关闭它,我将永远失去我的标准输入!我可以通过 Ctrl-Z 保留它。稍后如果我需要它,我会fg。但这是非常粗糙的。我想运行一个脚本,稍后将一些内容插入其中。类似于echo "/say hi">管道。如果我不保持某些东西运行,我就会失去标准输入。 echo 运行一次。这就是问题所在,它崩溃了标准输入。 我是 bash 脚本编写的新手,因此我们将不胜感激。

最佳答案

您已经有了使用 FIFO 的想法。您需要使用以下命令运行它:

while true; do cat pipe ; done | java -Xmx512M -Xms512M -jar minecraft_server.1.8.jar nogui > out.txt &

while 循环将确保即使用于写入 FIFO 的进程关闭文件,JVM 标准输入也不会关闭。它将再次开始将 pipe 连接到它,而 while 的标准输出被视为一个长流。

关于java - 从文件中获取 stdin 来控制后台 java 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26879074/

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