2017-05-20 36 views
0

所以我有一個docker鏡像,其中包含一個minecraft服務器。一個Minecraft服務器接受來自STDIN的輸入,因此在啓動服務器後,我可以通過在控制檯中鍵入它來提供命令(例如停止服務器)。通過FIFO保持訪問STDIN程序在後臺運行

理想我想啓動服務器的shell腳本,看起來這樣的:

#!/bin/sh 

.. some initialization .. 

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

這樣,Java可執行接管過程,以便它可以當搬運工發送SIGTERM被正常終止。

問題出現在我想保留一個人造STDIN時,它允許我通過另一個腳本在服務器上執行命令。要做到這一點我做了一個表示像這樣的控制檯FIFO:

rm -f console; mkfifo console 

我不知道我怎麼可以重定向這個FIFO到過程,雖然這種方式。我在讀使用cat先進先出在while循環,像這樣

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重定向到標準輸入服務器的

這聽起來對我來說很簡單,但我無法做到這一點。任何幫助將不勝感激。

回答

0

我剛剛發現< <(command)語法在/ bin/sh中不受支持,但支持在/ bin/bash中。

切換到這之後,我的最後一行是:

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

有時候,你必須接受,你必須安裝更多的依賴..