Я пытаюсь запустить сервер Minecraft на моем сервере unRAID.
Сервер будет работать в оболочке, а затем сидеть и ждать ввода. Чтобы остановить его, мне нужно набрать «стоп» и нажать клавишу ввода, и тогда это спасет мир и изящно выйдет, и я вернусь в оболочку. Это все работает, если я запускаю его через 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')"
отправить на экран «майнкрафт» текстовый останов и возврат каретки. Но это не сработает, даже если я наберу его прямо в командной строке. Но если у меня «screen -r», я могу попасть на экран с запущенным сервером, а затем набрать «stop», и он отключится правильно.
Сервер работает нормально, если я подключаюсь по сети и делаю это вручную, просто нужно запустить его без подключения к удаленному компьютеру.
источник
screen
не удалось запустить? Попробуйте добавитьset -x
в начало скрипта (сразу после#!
строки) и сообщить результат трассировки при запуске скрипта.#!/bin/bash
иset -x
в верхней части сценария, и показать нам вывод трассировки из сценария. Возможно, вам придется заглянуть в документацию unMENU, чтобы узнать, куда идет этот вывод.Ответы:
Я могу решить хотя бы часть проблемы: почему эта
stop
часть не работает. Экспериментально, когда вы запускаете сеанс Screen в отдельном режиме (screen -d -m
), окно не выбирается, поэтому вход, отправленный позжеscreen -X stuff
, просто теряется. Вам нужно явно указать, что вы хотите отправить нажатия клавиш в окно 0 (-p 0
). В любом случае, это хорошая идея, если вы по какой-либо причине создадите другие окна в этом сеансе экрана.(Экран переводится
^M
в control-M, который является символом, отправленным Enterклавишей.)Проблема с запуском сеанса из скрипта, вероятно, связана с unMENU.
источник
screen -d -m -S hi
а затем запустилscreen -S hi -p 0 -X stuff "cd <some_directory>^M"
и ничего не получил в результате ... он просто отправляет "cd <some_directory> ^ M" в виде строки и не интерпретирует "^ M" как клавишу ввода ...Во-первых, заметка о простом вводе новых строк:
Просто напомнить, что
$()
конструкция удаляет символы новой строки из выходных данных команды, чтобы выходные строки могли использоваться в качестве аргументов для других программ. Это может вызвать неожиданное поведение. В этом случае я предполагаю, что вы специально пытаетесь отправить эквивалент Enterнажатия клавиши. Хотя возврат каретки, который вы отправляете\r
, не будет чередоваться, есть несколько более простых способов ввода этого символа без необходимости в дополнительной команде.Вы можете поместить обычную новую строку в двойные кавычки
Или вы можете ввести символ в строке терминала, используя последовательность Ctrl+ v Enter. Это будет выглядеть примерно так же, как
^M
в терминале, но это специальный символ новой строки.Во-вторых, заметка о нестабильном поведении экрана. ( Объяснение и решение Жилем )
Экран имеет проблему с принятием ввода для сеанса экрана, который никогда не был присоединен. Если вы запустите это, он потерпит неудачу:
Но если вы запустите это, это будет работать:
Наконец, вы можете использовать гораздо лучше вести себя
tmux
вместоscreen
.GNU-Screen уже много лет является де-факто терминальным мультиплексором, но он давно перестал разрабатываться, и ошибки и причуды не исправляются. Tmux находится в активной разработке, включает в себя множество функций, которых экран не может касаться, и его поведение из коробки довольно интуитивно понятно. Кроме того, это лучше задокументировано. Вот как бы вы конвертировали свой код:
источник
screen -d -RR minecraft
?.screenrc
или у вас открыта целая куча сеансов экрана defunkt с таким именем, и вы отправляете данные не тому человеку?screen -list
?Я извиняюсь за то, что выкопал этот старый пост, но это помогло бы мне в моих усилиях, если бы эта информация была доступна в то время, когда у меня была похожая проблема. Есть много вопросов о том, как отправлять экранные команды в bash-скрипте. Как и в случае с кошачьей шкурой, это может быть сделано, но мне нравится этот способ. При этом вы можете отправить любую команду или сказать что-нибудь, просто вызвав функцию say_this.
Это с ssh!
источник