Запуск команды в новой сессии screen не работает.

Вопрос или проблема

Я хочу выполнить команду в новой сессии 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> используется для запуска в фоновом режиме в новой сессии Screen. Параметры -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-сервер, будут правильно инициализированы и запущены:

  1. Сначала выполните сценарий напрямую:
./startServer.sh
  1. При необходимости, воспользуйтесь командами управления Screen для подключения:

После выполнения вы можете подключиться к новой сессии с помощью:

screen -r minecraft-server-1-14-4

Этот подход устранит ошибки, связанные с двойным выделением ресурсов, и обеспечит стабильную работу сервера.

Заключение

Если у вас есть необходимость в использовании Screen для других процессов или в автоматизации запуска серверов, рекомендуется применять сценарии управления серверами с использованием скриптов оболочки без вложенного запуска дополнительных инструментов управления сессиями. Это снизит вероятность возникновения ошибок и упростит управление серверной инфраструктурой. Важно также время от времени убивать "мёртвые" сессии, которые создаются в случае неверного исполнения: screen -wipe.

Соблюдение этих простых рекомендаций окажет положительное воздействие на эксплуатационные характеристики вашего сервера и упростит процесс административного управления.

Оцените материал
Добавить комментарий

Капча загружается...