Сценарий Bash отправляет клавишу ввода или предотвращает зависание кошки

В настоящее время я запускаю сервер Minecraft в сеансе экрана с помощью этой команды:

(tail -f /path/to/fifo & cat) | java -Xmx2048M -jar minecraft_server.jar nogui

Вы можете отключить сервер Minecraft, отправив «стоп» в консоли сервера. Я использую fifo для отправки команд из других скриптов bash и cat, чтобы разрешить ввод с фактической консоли сервера Minecraft в сеансе экрана.

Что происходит, так это то, что если вы введете команду «стоп» в реальной консоли Minecraft, сервер в конечном итоге зависнет прямо перед тем, как он должен выйти из-за команды «кошка». Единственный способ обойти это — снова нажать Enter после отправки команды остановки.

Как я могу заставить «кошку» не заставлять это зависать?

Редактировать: Полный сценарий.

#!/bin/bash

serverDirectory=/opt/games/minecraft
pidFile=$serverDirectory/server.pid
fifoFile=$serverDirectory/server.fifo

cleanup() {
    rm -f $pidFile
    rm -f $fifoFile
}

if [ ! -p $fifoFile ]; then
    mkfifo $fifoFile && chmod 0777 $fifoFile
fi

echo $$ > $pidFile

# restart server if it stops
while true
do
    # how minecraft server should handle an interruption
    trap "{ echo 'stop' > $fifoFile ; }" SIGINT
    (tail -f $fifoFile & cat) | java -Xmx2048M -jar minecraft_server.jar nogui
    echo "Restarting server...."
    # if interruption occurs before we restart, stop trying to restart and clean up
    trap "{ cleanup ; exit 0 ; }" SIGINT SIGTERM
    sleep 5
done

person Eddy    schedule 28.05.2012    source источник


Ответы (1)


Я не использовал сервер Minecraft, поэтому я не знаю, на правильном ли я пути, но будет ли это работать?

#!/bin/sh

fifo="/path/to/fifo"
mkfifo $fifo
trap "rm -f $fifo" 0 1 2 3 6 15

/path/to/java -Xmx2048M -jar minecraft_server.jar nogui < $fifo &
echo $? > /path/to/minecraft.pid
cat > $fifo

Это по-прежнему не убивает cat после выхода сервера, но, по крайней мере, не блокирует сервер. Возможно, вы захотите запустить сервер Minecraft в функции, которая убивает кота при его выходе. Я предлагаю сохранить файл .pid для возможного использования в будущем. :-)

person ghoti    schedule 28.05.2012
comment
Спасибо. Я мог бы переключить скрипт, чтобы поставить процесс Java в фоновом режиме. Моя проблема в том, что сервер Minecraft никогда не закрывается из-за кота. Без кота он выйдет просто отлично. Я могу сказать это, потому что должен быть какой-то вывод, например, «Перезапуск» всякий раз, когда сервер выходит, этого не происходит с cat. Я отредактировал исходный пост с полным фактическим сценарием, который я использую. Когда я переключил его на ваш способ, произошло то же самое. - person Eddy; 28.05.2012
comment
Я понял, что целью вашего скрипта было поддерживать два способа ввода команд в стандартный ввод minecraft-server, поэтому я просто попытался добиться этого, используя другой метод. Я подозреваю, что если произошло то же самое, то на самом деле произошло что-то еще, просто выглядящее так же. :) Не удалось выйти из minecraft-server.jar, или это был скрипт-оболочка, который не вышел, потому что не было ничего, что могло бы убить cat? - person ghoti; 28.05.2012
comment
Ух ты. Я вижу именно то, о чем вы сейчас спрашиваете (не уверен, из-за вашей формулировки или потому, что с тех пор я спал). Извиняюсь, что не увидел этого раньше. Это на самом деле потому, что рядом нет ничего, что могло бы убить кошку. Если я запускаю процесс Java в фоновом режиме, как лучше всего проверить, работает ли сервер? Поместить часть cat › $fifo в цикл, пока существует pid сервера? - person Eddy; 29.05.2012