Я не думаю, что это возможно в screen
. Вы можете использовать fifo, чтобы получить вывод команды на экране , но я сомневаюсь, что «оболочка Minecraft» это поддержит.
Однако это «выполнимо» с помощью tmux
.
Трассировка стека
Чтобы заставить его работать правильно, вам нужно определить, в какой момент программа, которой вы передаете команды, зависла в соответствующей операции ввода-вывода. Способ сделать это - запустить трассировку стека и найти это. См. также :. Как определить, запущена ли команда или ожидает ввода данных пользователем? .
Это может быть немного сложно, потому что он может временно застрять на другом read
перед желаемым. Это также может потребовать некоторых догадок, основанных на том, как долго он застрял и на каком файловом дескрипторе. Его можно комбинировать с приведенным ниже предложением по подсчету строк -для большей точности.
Редактировать Во время тестирования я столкнулся с интерпретаторомread(10,
(zsh
)иselect(1, [0], NULL, NULL, NULL
(python3
cli ). Может быть несколько других возможностей, поэтому я не ограничивал RegEx
в приведенном ниже скрипте только этим. Сейчас он просто ищет открытую скобку. Может быть, кто-то знает более точный способ сделать это?
Статус процесса Хорошим индикатором может быть проверка того, запущен ли процесс или находится в спящем режиме. Вы можете сделать это с помощью ps
. Этот метод используется в доказательстве -концептуального сценария -ниже в сочетании с трассировкой стека.
Если сервер работает как Child Process
в Node, вы можете взаимодействовать с stdin
и stdout
процесса в Node. Вы можете просто искать новые строки (\n
), и если вы знаете, сколько строк должно быть на выходе,вы можете подсчитать их и «узнать», что он закончил работу и снова ожидает ввода. Вы можете совместить это с тайм-аутом.
Я переместил скрипт и некоторую документацию в репозиторий github . Я не проверял это с mc, но это работало с python3
и zsh
(. Насколько я мог это проверить, см. раздел «Тесты» ). Это все еще не идеально, так как все еще требует некоторого ожидания и может дать или не получить ложные срабатывания.
Как использовать
Вы можете запустить сервер/tmux
сессию так:
tmux new-session -d -s server_name "java -jar minecraft_server.jar"
Отправка команды на сервер будет выглядеть так:
./trun.sh -s server_name -c "the command"
Должен возвращаться вывод сервера. Возможно, вам придется отрегулировать параметры -H
и -T
.
Имейте в виду, что если вы запустите это на веб-сервере, вы можете столкнуться с проблемами, особенно если есть несколько пользователей. Возможно, вам придется реализовать блокировку , чтобы предотвратить одновременный доступ нескольких пользователей к оболочке. Я уверен, что у самого tmux
не было бы проблем с этим, но вы не можете действительно предсказать вывод, если другая команда могла быть запущена, пока вы пытаетесь прочитать указанный вывод.
Если вы собираетесь запускать это на сервере с доступом к www, рассмотрите возможность его защиты (, например, с помощью защищенного паролем прокси-сервера через apache
илиnginx
).
У вас есть файловая система BTRFS с двумя подтомами:
fedora
-Он установлен как по умолчанию подтом, и это то, что вы видите, когда монтируете файловую систему без указания подтома. Бывший.mount -t btrfs /dev/sda3 /mnt
root/snapshots/test
-Это созданный вами снимокfedora
В BTRFS нет такой вещи, как восстановление моментального снимка. Вместо этого вы просто загружаетесь, используя другой подтом в качестве корневой файловой системы. Есть несколько способов сделать это.
Для этого сначала необходимо смонтировать том верхнего -уровня, который всегда имеет идентификатор 5 и в вашем случае не монтируется по умолчанию. После этого вы можете сделать обычное переименование каталога.
Примечание.:В вашем случае это не сработает, потому что ваша ОС настроена на монтирование подтома по умолчанию в качестве корневой файловой системы, и этот процесс не изменит подтом по умолчанию.
mount -t btrfs -o subvolid=5 /dev/sda3 /mnt
cd /mnt
mv fedora fedora-old
mv fedora-old/root/snapshots/test fedora
При изменении подтома по умолчанию после перезагрузки ваша система будет загружаться с нового подтома по умолчанию. Идентификатор подтома 264, показанный ниже, взят из вашего примераbtrfs subvolume list /
btrfs subvolume set-default 264 /
То, как это делается, зависит от вашего загрузчика, но часто загрузчик (ex. GRUB )содержит строку конфигурации, которая указывает, какую файловую систему монтировать в качестве корневой файловой системы. Эту конфигурацию можно изменить для загрузки другого подтома. К сожалению, у меня нет примера, чтобы показать. Но знайте, что это невозможно сделать в /etc/fstab
, потому что этот файл читается позже.
В вашей конкретной ситуации, я думаю, вы получите наилучшие результаты, изменив подтом по умолчанию.