So habe ich ein Docker-Image, das einen Minecraft-Server enthält. Ein Minecraft-Server nimmt Eingaben von der STDIN, also kann ich nach dem Starten des Servers mit java -jar server.jar
es Befehle eingeben (um den Server zum Beispiel zu stoppen), indem Sie es in der Konsole eingeben.Behalten Sie den Zugriff auf STDIN eines Programms im Hintergrund über einen FIFO
Idealerweise möchte ich den Server in einem Shellscript starten, das etwas aussieht:
#!/bin/sh
.. some initialization ..
exec java -Xmx$RAM -Xms$RAM -jar server.jar
Auf diese Weise der ausführbaren Java-Datei über den Prozess dauert, so dass es ordnungsgemäß beendet werden kann, wenn Docker eine SIGTERM
sendet.
Das Problem kommt, wenn ich eine künstliche STDIN
behalten möchte, die es mir ermöglicht, Befehle über ein anderes Skript auf den Server auszuführen. Dazu habe ich einen FIFO, der die Konsole wie so darstellt:
rm -f console; mkfifo console
Ich bin nicht sicher, wie ich diese FIFO
in den Prozess, obwohl diese Art und Weise umleiten. Ich lese das Fifo cat
in einer while-Schleife wie so
while true; do cat console; done
Und dachte an so etwas wie dies zu tun:
while true; do cat console; done | exec java -jar server.jar
Oder etwas Ähnliches:
exec java -jar server.jar < <(while true; do cat console; done)
Für Letzteres habe ich mir bash: pipe data into an exec'd command angesehen, was mir leider syntax error: unexpected redirection
Ich habe dies auch versucht:
while true; do cat console; done >&0 &
exec java -jar server.jar
die den Server einzufrieren scheint, während es beginnt.
Ich habe keine Ahnung, warum das alles nicht funktioniert, und ich weiß nicht, wie ich es zum Laufen bringen kann.
Um klar zu sein, was ich erreichen möchte:
- Haben Java (Server) Hauptprozess übernehmen
- Haben ein FIFO zum STDIN des Servers
umgeleitet Es klingt so einfach für mich, aber ich kann es einfach nicht passieren lassen. Jede Hilfe würde sehr geschätzt werden.