відправлення введення тексту на окремий екран


44

Я намагаюся запустити сервер minecraft на своєму сервері unRAID.

Сервер буде працювати в оболонці, а потім сидіти там і чекати введення. Щоб зупинити це, мені потрібно набрати "стоп" і натиснути клавішу Enter, і тоді це врятує світ і витончено вийде, і я знову в оболонці. Це все працює, якщо я запускаю його через 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" зупинку тексту та повернення вагона. Але це не працює, навіть якщо я набираю його безпосередньо в командному рядку. Але якщо я 'screen -r' я можу потрапити на екран із запущеним сервером, тоді введіть 'stop' і він справно закриється.

Сервер працює добре, якщо я ввожу телнет і роблю це вручну, просто потрібно запустити його, не підключаючись до віддаленого комп'ютера.


Це правильно виглядає . Який повний вміст сценарію і як ви його запустите? Чи дає це якийсь вихід? Як сказати, що screenне вдалося почати? Спробуйте додати set -xвгорі сценарію (відразу після #!рядка) та повідомте про вихід трасування під час запуску сценарію.
Жил "ТАК - перестань бути злим"

це повний вміст сценарію :) команда екрана працює, якщо я ввожу її безпосередньо, тому я думаю, що моя головна проблема - стоп-частина
Річард Племп

Ви написали: "Якщо я виконую цей рядок із сценарію, він, схоже, не налаштовує екран". Так працює стартова частина чи ні? Якщо цього немає, дивіться мій перший коментар.
Жил "ТАК - перестань бути злим"

Я намагаюся запустити його як сценарій користувача unMENU. Якщо у мене є сценарій користувача з такою точною командою на екрані, нічого не відбувається. Якщо я введіть команду screen у вікно telnet, вона запустить сервер на екран, як ви очікували. Тому я думаю, що є певна різниця, яку я не розумію в способі обробки сценаріїв користувача unMENU.
Річард Плун

Тепер ми кудись дістаємось. Будь ласка, оновіть своє запитання інформацією про те, як ви користуєтесь unMENU. І спробуйте додати два рядки #!/bin/bashі set -xу верхній частині сценарію, і показати нам висновок трасування з сценарію. Можливо, вам доведеться переглянути документацію unMENU, щоб дізнатися, куди йде цей вихід.
Жил "ТАК - перестань бути злим"

Відповіді:


40

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

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

(Екранний переклад ^Mна control-M - символ, що надсилається Enterключем.)

Проблема із запуском сеансу зі сценарію, ймовірно, пов’язана з unMENU.


1
прекрасно, чудово працює (принаймні, з командного рядка, пізніше хлопці unmenu хлопці). Здається, це кинуло досить багато людей, і я вперше побачив конкретне рішення. Я просто хочу, щоб у мене було достатньо балів, щоб проголосувати за тебе: D
Річард Племп

Чорт с ** т! Працює навіть екран вже додається, без повторного приєднання! Який чудовий спосіб надсилати команди простим програмам з інших програм у системі. Дякую! :)
Grzegorz Wierzowiecki

У мене ніколи не було цієї проблеми, напевно, тому, що я завжди планував мати кілька (названих) вікон у своєму екрані, і я завжди вибираю вікно на ім'я.
Ekevoo

Посібник, для довідки: -X Надіслати вказану команду сеансу запущеного екрану. Ви можете використовувати опцію -S, щоб вказати сеанс екрана, якщо у вас кілька запущених сеансів на екрані. Ви можете скористатися опцією -d або -r, щоб вказати екрану шукати лише приєднані або окремі сеанси екрана. Зауважте, що ця команда не працює, якщо сеанс захищений паролем.
KrisWebDev

3
це не працює для мене. Я створив екран із, screen -d -m -S hiа потім запустіть screen -S hi -p 0 -X stuff "cd <some_directory>^M"і нічого не отримаю в результаті ... він просто надсилає "cd <some_directory> ^ M" як рядок і не інтерпретує "^ M" як ключ введення ...
Tanner Strunk

23

По-перше, примітка про легке введення нових рядків:

Лише вгору, що $()конструкція знімає нові рядки з виводу команди, щоб рядки виводу могли використовуватися як аргументи для інших програм. Це може викликати несподівану поведінку. У цьому випадку я припускаю, що ви спеціально намагаєтесь надіслати еквівалент Enterнатискання клавіші. Поки повернення вагона, з яким ви надсилаєте \r, не буде смугастим, існує кілька простих способів ввести цей символ без необхідності додаткової команди.

  1. Ви можете розмістити звичайний новий рядок всередині подвійних пропозицій

    screen -S minecraft -X stuff "stop
    "
    
  2. Або ви можете ввести символ у термінальній лінії, використовуючи послідовність Ctrl+ v Enter. Це буде виглядати приблизно як ^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"

якщо я вручну перемикаюсь за допомогою екрана -r, я можу побачити екран, і текст взагалі не вводиться. навіть якщо повернення вагона не вдалося, я все одно повинен набрати "зупинку". Але нічого
Річард Племп

якщо у мене є скрипт із екраном -r в одному рядку, а потім на екрані -X речі "стоп ^ М", то він зупиняє сервер, але також скаржиться на "помилку невідомого варіанту r"
Річард Племп

Я перевірив тут, створивши екранний сеанс, потім використовуючи команду вище, і вона працює чудово. Чи можете ви підключитися до екранного сеансу за допомогою screen -d -RR minecraft?
Калеб

так, це підключає мене до екрану. так само екран -r .. зависає, якщо я спробую екран -S minecraft -X речі "стоп ^ М", то вручну екран -r, на екрані є текст "стоп".
Річард Плун

Працює для мене. Можливо, у вас є щось .screenrcстильне або у вас є маса відкритих сеансів екрану з цим іменем, і тому ви надсилаєте дані невірному? screen -list?
Калеб

4

Прошу вибачення за перекопання цієї старої посади, але це допомогло б мені в моїх починаннях, якби ця інформація була доступна в той час, коли у мене виникли подібні проблеми. Є багато запитань щодо того, як надсилати екранні команди в скрипті 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 !@#$%^&*()<>?This string will work!"

Приємно і стисло ... Ласкаво просимо до U&L
eyoung100
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.