Вопрос или проблема
Я хочу выполнить команду в новой сессии screen (и отключиться от нее), но у меня это не получается. Я пытался запустить процесс в новой сессии screen и отключиться от нее следующим образом:
screen -d -m mycommmand
Но когда я пытаюсь подключиться к этой сессии screen с помощью
screen -r
Я получаю сообщение “There is no screen to be resumed”. Я также пытался запустить команду в новой сессии screen с помощью
screen mycommand
Когда я это делаю, новая сессия screen запускается, но команда не выполняется.
Команда — это скрипт .sh, который запускает игровой сервер, но игровой сервер не запускается.
[Редактирование] Поскольку некоторые люди попросили точную команду, вот она: Это bash-скрипт, который должен запустить minecraft-сервер в отдельной сессии screen.
./startServer.sh
Вот скрипт .sh:
cd "/home/tim/minecraft/survivalServer"
screen -S "minecraft-server-1-14-4" -m -d /home/tim/java/bin/java -Xmx4096M -Xms1024M -jar /home/tim/minecraft/survivalServer/minecraft_server.1.14.4.jar nogui
Теперь проблема в том, что когда я запускаю скрипт, он не может создать новую сессию screen. Почему так происходит?
Буду благодарен за помощь. Спасибо
Проблема в том, что вы пытаетесь запустить вложенный, отсоединенный экземпляр screen внутри другого отсоединенного экземпляра screen. Ваш скрипт содержит строку:
screen -S "minecraft-server-1-14-4" -m -d /home/tim/java/bin/java -Xmx4096M -Xms1024M -jar /home/tim/minecraft/survivalServer/minecraft_server.1.14.4.jar nogui
Это запускает screen, называет сессию screen minecraft-server-1-14-4
, затем запускает minecraft и отсоединяется. Но вы также пытаетесь выполнить команду screen -d -m ./startserver.sh
. Таким образом, до того как сессия screen создается в скрипте, вы уже запускаете скрипт внутри отсоединенной сессии screen. Это… обычно не очень хорошо работает.
Это функционально то же самое, что и это:
wolferz@khaos ~ $ screen -m -d screen -S 'mysession' -m -d top
wolferz@khaos ~ $ screen -r
There is a screen on:
24850.mysession (07/24/2019 10:47:46 PM) (Dead ???)
Remove dead screens with 'screen -wipe'.
There is no screen to be resumed.
Вы хотите просто запустить скрипт напрямую. Просто выполните ./startserver.sh
. Это должно вернуть вас обратно к командной строке. Затем вы сможете подключиться к консоли minecraft, выполняя screen -r
, как обычно.
Ответ или решение
Вопрос о запуске команды в новой сессии screen
действительно требует внимательного анализа специфики работы инструментов. Ваша цель – запустить Minecraft-сервер в отдельной сессии screen
, чтобы он работал в фоновом режиме, и к ней можно было в любой момент подключиться. Проблема заключается в неправильном подходе к созданию вложенных сессий, что вызывает ошибку и препятствует выполнению задуманного.
Теория
Программа GNU Screen позволяет создавать виртуальные терминальные сессии, которые могут работать в фоновом режиме, не прерываясь. Это особенно полезно для долгосрочных задач, требующих постоянного выполнения, таких как серверные процессы. Основной принцип работы Screen заключается в создании "оболочек", которыми можно управлять, подключаясь и отключаясь от них по мере необходимости.
Команда screen -d -m <command>
используется для запуска -d -m
означают, что новая сессия запускается сразу в режиме разделения (detach). Однако важно помнить, что эта команда обладает определённой сложностью при вложенном использовании, что является корнем рассматриваемой проблемы.
Пример
Рассмотрим более подробно пример, изложенный в вашем вопросе. Вы пытаетесь запустить сценарий startServer.sh
, который, в свою очередь, создает ещё одну (вложенную) сессию Screen:
cd "/home/tim/minecraft/survivalServer"
screen -S "minecraft-server-1-14-4" -m -d /home/tim/java/bin/java -Xmx4096M -Xms1024M -jar /home/tim/minecraft/survivalServer/minecraft_server.1.14.4.jar nogui
Запуск этого скрипта внутри другой сессии Screen с использованием команды screen -d -m ./startServer.sh
делает сессию двойной, что нарушает нормальную работу и приводит к ошибке: "There is no screen to be resumed". Это случается потому, что внутренняя сессия либо некорректно запускается, либо сразу же завершается из-за отсутствия активного сеанса, который можно было бы к чему-либо подключить.
Применение
Чтобы решить эту проблему, необходимо избегать вложенного использования Screen. Наилучший подход – это запускать скрипт непосредственно, без задействования screen
в командной строке. Это гарантирует, что все процессы, включая Minecraft-сервер, будут правильно инициализированы и запущены:
- Сначала выполните сценарий напрямую:
./startServer.sh
- При необходимости, воспользуйтесь командами управления Screen для подключения:
После выполнения вы можете подключиться к новой сессии с помощью:
screen -r minecraft-server-1-14-4
Этот подход устранит ошибки, связанные с двойным выделением ресурсов, и обеспечит стабильную работу сервера.
Заключение
Если у вас есть необходимость в использовании Screen для других процессов или в автоматизации запуска серверов, рекомендуется применять сценарии управления серверами с использованием скриптов оболочки без вложенного запуска дополнительных инструментов управления сессиями. Это снизит вероятность возникновения ошибок и упростит управление серверной инфраструктурой. Важно также время от времени убивать "мёртвые" сессии, которые создаются в случае неверного исполнения: screen -wipe
.
Соблюдение этих простых рекомендаций окажет положительное воздействие на эксплуатационные характеристики вашего сервера и упростит процесс административного управления.