Основы
March 7

Работа со screen

Введение

Работа терминала устроена таким образом, что при его закрытии также остановят свою работу процессы, которые не запущены в фоне. Если провести аналогию с Windows, то это, то же самое что запустить, например, установку Google Chrome, но во время инсталляции закрыть установочную программу. В случае с Windows мы просто сворачиваем окно такой программы, чтобы оно нам не мешало. Что же касается серверов с Linux, то в терминале мы всё выполняем с помощью команд и нет возможности свернуть окна по причине их отсутствия.

Чтобы на сервере запустить программу в фоне и оставить её там работать, используют разные подходы. Например, можно создать сервисный файл и запустить его, а потом просто при помощи специальных команд проверять логи. А можно воспользоваться сторонними программами, которые создают сессии и оставляют их работать в фоновом режиме. Наиболее распространенные решения — это Tmux и Screen, в этой статье познакомимся со вторым.

Screen — это утилита для управления сессиями терминала, позволяющая запускать процессы в фоне и восстанавливать сессии после отключения.

Установка и полезные команды

На сервер c Ubuntu утилита Screen устанавливается буквально двумя командами

sudo apt update
sudo apt install screen

Для создания сессии воспользуйтесь командой ниже, где имя_сессии — это желаемое имя для сессии, которую вы хотите создать (используйте только цифры и латинские буквы). После использования этой команды вы автоматически попадаете в сессию, то есть это как новое “окно” внутри терминала, но интерфейс не поменяетсяBashCopy

screen -S имя_сессии

Внутри сессии вы можете выполнять команды и запускать всё то, что и в основном “окне” командной строки.

  • Для выхода из сессии можно использовать комбинацию клавиш Ctrl+A, затем D, в некоторых пользователей на этом этапе возникают проблемы — они не могут выйти из сессии или вовсе случайно закрывают её. Но есть альтернатива, из сессии можно выйти при помощи команды ниже. Но если в сессии запущена нода и идут логи, то такой командой выйти не получиться и всё же придется воспользоваться Ctrl+A, затем D,
screen -d

Ctrl+A, затем D = screen -d, но это скорее вопрос привычки, чем необходимости. Выходить из сессии при помощи комбинации намного быстрее, но для новичков выход при помощи команды будет более надежным вариантом.

Если вам нужно повторно зайти в сессию после выхода, то используйте команду ниже, где имя_сессии — это имя сессии, которую вы создавали ранее

screen -r имя_сессии

Частая ошибка новичков — это создание множества сессий с одинаковыми названиями по причине невнимательности. Дело в том, что новички часто путают команды создания сессии (флаг -S) и открытия уже существующей сессии (флаг -r). Проблема в том, что Screen разрешает создавать много сессий с одинаковыми названиями, так как он всё равно присваивает цифровой идентификатор (ID) перед буквенным именем, пример на скриншоте ниже

Чтобы увидеть список уже запущенных сессий, воспользуйтесь командой ниже

screen -ls

Понятно, что такое количество сессий с одинаковыми названиями нам не нужны, для удаления сессий используют следующую команду, где имя_сессии — это имя сессии, которую вы хотите удалить

screen -S имя_сессии -X quit

Если в списке сессия с уникальным именем, то можно просто написать, например, screen -S forto -X quit, но если есть хотя бы два одинаковых имени, то придется указывать ID — screen -S 3290953.forto -X quit или screen -S 3290953 -X quit

Но командная строка тем и хороша, что практически всё можно автоматизировать. Если воспользоваться командой ниже, то она удалит все сессии с одинаковыми именами, где имя_сессии — это имя, присвоенное для многих сессий, которые вы хотите удалить

screen -ls | grep "имя_сессии" | awk '{print $1}' | xargs -I {} screen -S {} -X quit

Для понимания работы команды:

  1. screen -ls: выводит список всех сессий.
  2. grep "forto": фильтрует список, оставляя только сессии с названием "имя_сессии".
  3. awk '{print $1}': извлекает идентификаторы (ID) этих сессий.
  4. xargs -I {} screen -S {} -X quit: передает каждый ID в команду screen -S <ID> -X quit, которая завершает соответствующую сессию.

Шпаргалка

Все команды для управления Screen довольно простые и их легко запомнить уже после нескольких раз использования, но на всякий случай вот шпаргалка:

Заключение

Более подходящий вариант для работы с нодами через командную строку — это их запуск через сервисный файл, но не всегда проекты предоставляют такую возможность. На самом деле Screen — это неплохая альтернатива, но всё-таки рекомендуем проверять работу запущенных сессий (минимум один раз в 1-2 дня), так как через сбой на сервере они могут закрыться, а Screen не умеет самостоятельно повторно их открывать.