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

Keeping access to STDIN of a program run in the background via a FIFO

所以我有一个 docker 图像,包含一个 minecraft 服务器。 Minecraft 服务器从 STDIN 获取输入,因此在使用 java -jar server.jar 启动服务器后,我可以通过在控制台中输入命令(例如停止服务器)来为其提供命令。

理想情况下,我想在看起来像这样的 shellscript 中启动服务器:

#!/bin/sh

.. some initialization ..

exec java -Xmx$RAM -Xms$RAM -jar server.jar

这样 java 可执行文件接管进程,以便在 docker 发送 SIGTERM.

时正常终止

当我想保留一个允许我通过另一个脚本在服务器上执行命令的人工 STDIN 时,问题就出现了。为此,我制作了一个代表控制台的 FIFO,如下所示:

rm -f console; mkfifo console

我不确定如何将此 FIFO 以这种方式重定向到进程中。我正在像这样

这样的 while 循环中使用 cat 读取 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

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

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

明确我要达到的目的:

这对我来说听起来很简单,但我就是做不到。任何帮助将不胜感激。

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

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

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

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