所以我有一个包含一个Minecraft服务器的docker镜像。一个Minecraft服务器接收来自STDIN的输入,因此在使用java -jar server.jar
启动服务器后,我可以通过在控制台中输入命令来提供命令(例如,停止服务器)。
理想情况下,我想在一个看起来像这样的shellcript中启动服务器:
#!/bin/sh
.. some initialization ..
exec java -Xmx$RAM -Xms$RAM -jar server.jar
这样java可执行文件就会接管进程,以便在docker发送SIGTERM
时可以正常终止它。
当我想保留一个人为的STDIN
时,问题出现了,它允许我通过另一个脚本在服务器上执行命令。为此,我创建了一个代表控制台的FIFO:
rm -f console; mkfifo console
我不知道如何以这种方式将此FIFO
重定向到流程中。我正在使用cat
在像这样的while循环中读取fifo
while true; do cat console; done
考虑做这样的事情:
while true; do cat console; done | exec java -jar server.jar
或类似的东西:
exec java -jar server.jar < <(while true; do cat console; done)
对于后者,我看了bash: pipe data into an exec'd command,遗憾的是我syntax error: unexpected redirection
我也试过这个:
while true; do cat console; done >&0 &
exec java -jar server.jar
似乎在服务器启动时冻结服务器。
我不知道为什么所有这些都不起作用,我不知道如何让它发挥作用。
要清楚我想要达到的目标:
这对我来说听起来很简单,但我无法实现。任何帮助将不胜感激。
答案 0 :(得分:0)
我刚刚发现/ bin / sh中不支持< <(command)
语法,但它在/ bin / bash中是支持。
切换到那之后,我的最后一行是:
exec java -jar server.jar < <(tail -f console)
有时您只需要接受必须安装更多依赖项。