保持对程序的STDIN的访问通过FIFO在后台运行

时间:2017-05-20 19:31:52

标签: shell docker stdin file-descriptor io-redirection

所以我有一个包含一个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

似乎在服务器启动时冻结服务器。

我不知道为什么所有这些都不起作用,我不知道如何让它发挥作用。

要清楚我想要达到的目标:

  • 让java(服务器)接管主进程
  • 将FIFO重定向到服务器的STDIN

这对我来说听起来很简单,但我无法实现。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我刚刚发现/ bin / sh中不支持< <(command)语法,但它在/ bin / bash中是支持。

切换到那之后,我的最后一行是:

exec java -jar server.jar < <(tail -f console)

有时您只需要接受必须安装更多依赖项。