it-swarm-ru.tech

отправка ввода текста на отдельный экран

Я пытаюсь запустить сервер minecraft на моем сервере unRAID.

Сервер будет работать в командной консоли и сидеть там в ожидании ввода. Чтобы остановить его, мне нужно набрать "стоп" и нажать клавишу ввода, и тогда это спасет мир и изящно выйдет, и я вернусь в Shell. Это все работает, если я запускаю его через telnetting в поле NAS), но я хочу запустить его прямо на коробке.

это то, что я ранее имел в качестве первой попытки:

#define USER_SCRIPT_LABEL Start Minecraft server
#define USER_SCRIPT_DESCR Start minecraft server. needs sde2 mounted first
cd /mnt/disk/sde2/MCunraid
screen -d -m -S minecraft /usr/lib/Java/bin/Java -Xincgc -Xmx1024M -jar CraftBukkit.jar

MCunraid - это папка, в которой у меня есть Craftbukkit.jar и все мировые файлы и т.д. Если я наберу эту строку экрана напрямую, экран отсоединится и сервер запустится. Если я выполню эту строку из скрипта, то, похоже, не будет экрана

для остановки сервера мне нужно "напечатать" в STOP и затем нажать Enter. Мой подход был

screen -S minecraft -X stuff "stop $(echo -ne '\r')"

отправить на экран "minecraft" текст s-t-o-p и возврат каретки. Но это не сработает, даже если я наберу его прямо в командной строке. Но если у меня "screen -r", я могу попасть на экран с запущенным сервером, а затем набрать "stop", и он отключится правильно.

Сервер работает нормально, если я подключаюсь по сети и делаю это вручную, просто нужно запустить его без подключения к удаленному компьютеру.

47
richard plumb

Я могу решить хотя бы часть проблемы: почему часть stop не работает. Экспериментально, когда вы запускаете сеанс экрана в отдельном режиме (screen -d -m), окно не выбрано, поэтому входные данные позже отправляются с screen -X stuff просто потерян. Вам нужно явно указать, что вы хотите отправить нажатия клавиш в окно 0 (-p 0). В любом случае, это хорошая идея, если вы по какой-либо причине создадите другие окна в этом сеансе экрана.

screen -S minecraft -p 0 -X stuff "stop^M"

(Переведите экран ^M для контроля-M, который является символом, отправленным Enter ключ).

Проблема с запуском сеанса из сценария, вероятно, связана с unMENU.

43

Во-первых, заметка о простом вводе новых строк:

Просто напомнить, что конструкция $() удаляет символы новой строки из выходных данных команды, чтобы выходные строки могли использоваться в качестве аргументов для других программ. Это может вызвать неожиданное поведение. В этом случае я предполагаю, что вы специально пытаетесь отправить эквивалент Enter нажатие клавиши. При возврате каретки вы отправляете с \r не будет полосатым, есть несколько более простых способов ввода этого символа без необходимости в дополнительной команде.

  1. Вы можете поместить обычную новую строку в двойные кавычки

    screen -S minecraft -X stuff "stop
    "
    
  2. Или вы можете ввести символ в строке терминала, используя Ctrl+vEnter последовательность. Это будет выглядеть примерно как ^M в терминале, но это специальный символ новой строки.

    screen -S minecraft -X stuff "stop^M"
    

Во-вторых, заметка о нестабильном поведении экрана. ( Объяснение и решение Жилем )

Экран имеет проблему с принятием ввода для сеанса экрана, который никогда не был присоединен. Если вы запустите это, он потерпит неудачу:

screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Но если вы запустите это, это будет работать:

screen -d -m -S minecraft zsh
screen -r minecraft (then disconnect with Ctrl-a-d)
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Наконец, вы можете использовать гораздо лучше себя вести tmux вместо screen.

GNU-Screen был де-факто терминальным мультиплексором в течение многих лет, но он давно перестал развиваться, и ошибки и причуды не исправляются , Tmux находится в активной разработке, включает в себя множество функций, которых экран не может касаться, и его поведение из коробки довольно интуитивно понятно. Кроме того, это лучше задокументировано. Вот как бы вы конвертировали свой код:

# Start new detached tmux session with a named window pane running the Java app
tmux new-session -d -n minecraft /usr/lib/Java/bin/Java [args]

# Send it keys to stop the mincraft server
tmux send-keys -t minecraft "stop^M"
25
Caleb

Я извиняюсь за то, что выкопал этот старый пост, но это помогло бы мне в моих усилиях, если бы эта информация была доступна в то время, когда у меня была похожая проблема. Есть много вопросов о том, как отправлять экранные команды в bash-скрипте. Как и в случае с кошачьей шкурой, это может быть сделано, но мне нравится этот способ. При этом вы можете отправить любую команду или сказать что-нибудь, просто вызвав функцию say_this.

#!/bin/bash

say_this()
{
    screen -S minecraft -p 0 -X stuff "$1^M"
}

say_this "say Saving world"
say_this "save-off"
say_this "save-all"
...

Это с ssh!

#!/bin/bash

say_this()
{
    # Dont forget to set NAME or whatever
    ssh -p 8989 192.168.1.101 screen -S $NAME -p 0 -X stuff \"$1^M\"
}

say_this "say test"
say_this "say [email protected]#$%^&*()<>?This string will work!"
5
fuzzyfreak