2017-05-20 4 views
0

J'ai donc une image docker, contenant un serveur minecraft. Un serveur minecraft prend l'entrée du STDIN, donc après avoir démarré le serveur avec java -jar server.jar je peux le nourrir avec des commandes (pour arrêter le serveur par exemple) en le tapant dans la console.Garder l'accès à STDIN d'un programme exécuté en arrière-plan via un FIFO

Idéalement je veux démarrer le serveur dans un shellscript qui ressemble à quelque chose ceci:

#!/bin/sh 

.. some initialization .. 

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

De cette façon, l'exécutable java prend en charge le processus, afin qu'il puisse être gracieusement mis fin lorsque docker envoie un SIGTERM.

Le problème vient quand je veux garder un STDIN artificiel, qui me permet d'exécuter des commandes sur le serveur via un autre script. Pour ce faire, je fait une FIFO qui représente la console comme ceci:

rm -f console; mkfifo console 

Je ne sais pas comment je peux rediriger ce FIFO dans le processus de cette façon cependant. Je lis la fifo en utilisant cat en temps en boucle comme si

while true; do cat console; done 

Et pensé à faire quelque chose comme ceci:

while true; do cat console; done | exec java -jar server.jar 

Ou quelque chose comme ceci:

exec java -jar server.jar < <(while true; do cat console; done) 

Pour ce dernier, j'ai regardé bash: pipe data into an exec'd command qui me donne malheureusement syntax error: unexpected redirection

J'ai aussi essayé ceci:

while true; do cat console; done >&0 & 

exec java -jar server.jar 

qui semble figer le serveur alors qu'il commence.

Je ne sais pas pourquoi tout cela ne fonctionne pas, et je ne sais pas comment je peux le faire fonctionner.

Pour être clair de ce que je veux atteindre:

  • avoir Java (le serveur) prendre en charge le processus principal
  • Avez FIFO redirigé vers le STDIN du serveur

Cela me semble si simple, mais je ne peux tout simplement pas y arriver. Toute aide serait grandement appréciée.

Répondre

0

Je viens de découvrir que la syntaxe < <(command) n'est pas supportée par/bin/sh mais c'est un support dans/bin/bash.

Après le passage à cela, ma dernière ligne est la suivante:

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

Parfois, il vous suffit d'accepter que vous devez installer plus dépendances ..