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.