通过 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
这似乎在启动时冻结了服务器。
我不知道为什么所有这些都不起作用,我也不知道如何让它起作用。
明确我要达到的目的:
- 让java(服务器)接管主进程
- 将 FIFO 重定向到服务器的 STDIN
这对我来说听起来很简单,但我就是做不到。任何帮助将不胜感激。
我刚发现 < <(command)
语法在 /bin/sh 中不受支持,但在 /bin/bash 中支持。
切换到那个之后,我的最后一行是:
exec java -jar server.jar < <(tail -f console)
有时您只需要接受必须安装更多依赖项..
所以我有一个 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
以这种方式重定向到进程中。我正在像这样
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
这似乎在启动时冻结了服务器。
我不知道为什么所有这些都不起作用,我也不知道如何让它起作用。
明确我要达到的目的:
- 让java(服务器)接管主进程
- 将 FIFO 重定向到服务器的 STDIN
这对我来说听起来很简单,但我就是做不到。任何帮助将不胜感激。
我刚发现 < <(command)
语法在 /bin/sh 中不受支持,但在 /bin/bash 中支持。
切换到那个之后,我的最后一行是:
exec java -jar server.jar < <(tail -f console)
有时您只需要接受必须安装更多依赖项..