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

时间:2014-11-12 04:05:17

标签: java bash stdin minecraft

我想在后台使用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。因此,如果我在/.txt中/停止它将停止服务器。但只有一次。我想将命令放在文本文件中并将其传递给minecraft服务器。进程运行时,该文件将成为我的键盘输入。我知道我可以使用屏幕,但我想看看我是否可以用文件作为输入来运行它。再次,in.txt将是我的输入。 所以我可以做这样的事情。

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

OR

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



另一个兔子洞。

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

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

如果我cat > pipe我的提示再次被提取,但我可以输入命令并将其作为标准输入执行。所以,如果我/say hi它会运行它。真棒!一个问题。我需要回复我的bash提示。如果我使用Ctrl-C关闭它,我将永远失去我的标准!我可以通过Ctrl-Z保留它。如果我需要它,我会fg。但那非常粗糙。我想运行一个脚本,以后会把某些东西粘进去。像echo "/say hi" > pipe这样的东西。如果我不保持运行,我会失去标准输入。 echo运行一次。这就是问题所在,它会破坏标准输入。   我是bash脚本的新手所以一点帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

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

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