我想在后台使用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脚本的新手所以一点帮助将不胜感激。
答案 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
连接它,而标准输出则被视为一个长流。