2017-05-20 4 views
0

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

gibt

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.

Antwort

0

Ich habe gerade herausgefunden, dass die < <(command) Syntax nicht in/bin/sh unterstützt wird, aber es ist Unterstützung in/bin/bash.

Nach dem Einschalten meine letzte Zeile ist:

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

Manchmal muss man einfach akzeptieren, dass Sie mehr Abhängigkeiten installieren müssen ..

Verwandte Themen