Шпаргалка по GNU screen

24.07.2021

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

Это полезно если нужно визуально отслеживать какие-то real-time данные из нескольких терминалов (эмуляций терминалов).

Так же при помощи reptyr можно направить вывод сервиса systemd в терминал сеанса screen и наблюдать вывод. Затем можно открепить сеанс screen и закрыть терминал, при этом сервис systemd продолжит свою работу.

Ссылка на по-русски про детальное описание screen

Сеансы

Сеанс (терминальная сессия) - среда для работы с сервером. Проще - инстанс терминала.

В самом простом случае для создания нового сеанса необходимо:

•••
bash
screen
После чего будет приветсвенное сообщение программы, где нужно нажать space или enter.

Приветственное сообщение программы screen
Приветственное сообщение программы screen

Можно создать именованный сеанс (name - произвольное имя на латинице):

•••
bash
screen -S name

Просмотр списка сеансов:

•••
bash
> screen -ls There are screens on: 5811.test2 (22.07.2021 09:51:25) (Detached) 5794.test1 (22.07.2021 09:51:17) (Attached) 5582.pts-0.byurrer-Lenovo-G580 (22.07.2021 09:44:20) (Detached) 3 Sockets in /run/screen/S-byurrer.

В каждом сеансе screen работают горячие клавиши, которые начинаются с Ctrl+a

Несколько горячих клавиш управления сеансом:

  • d - открепить текущий сеанс
  • ? - просмотр всех команд и горячих клавиш screen, но в терминале Ubuntu 21.04 не работает
  • c - очистить экран
  • : - ввод команды screen:
    • kill - уничтожить текущий сеанс
    • help - просмотр всех команд и горячих клавиш screen
Сеансы могут быть в 3 состояниях:
  • detached - сеанс запущен, но не прикреплен к терминалу
  • attached - сеанс запущен, прикреплен к терминалу и ожидает ввод
  • dead - сеанс некорректно завершен, например при помощи kill -9
Перейти в detached сеанс (PID - pid процесса или название сеанса):
•••
bash
screen -r PID

Попытка перейти на attached сеанс закончится провалом:

•••
bash
> screen -r test1 There is a screen on: 5794.test1 (22.07.2021 09:51:17) (Attached) There is no screen to be resumed matching test1.

Все потому что процесс сеанса используется клиентом и ожидает ввод. Для того чтобы подключится к attached сеансу нужно его открепить (сделать detached):

•••
bash
screen -d PID

Теперь можно прикрепиться к сеансу. Но можно открепить и прикрепить сеанс в одной команде так:

•••
bash
screen -rD PID

Уничтожить сеанс можно через команду kill, в этом случае произойдет уничтожение процесса и сеанса screen:

•••
bash
kill PID

Уничтожение процесса через kill -9 приведет к тому, что уничтожаемый сеанс останется в списке сеансов screen, но будет со статусом dead, это происходит по той причине что kill -9 не дает процессу самостоятельно завершится, а уничтожает его принудительно (сигнал SIGKILL не может быть обработан уничтожаемым процессом). Продробнее про kill vs kill -9.

•••
bash
> kill -9 7117 > screen -ls There is a screen on: 7117.test (21.07.2021 20:43:26) (Dead ???) Remove dead screens with 'screen -wipe'. 1 Socket in /run/screen/S-byurrer.

После kill -9 сеанс нужно очистить следующим образом:

•••
bash
screen -wipe PID

Регионы

Каждый сеанс позволяет разделять терминал на несколько регионов, но это вовсе необязательно, можно переключаться между сеансами в однорегиональном режиме.

Несколько регионов терминала в сеансе screen
Несколько регионов терминала в сеансе screen

Команды screen (Ctrl + a + :) для работы с регионами:

  • split - разделить окно по горизонтали
  • split -v - разделить окно по вертикали
  • remove - закрыть текущий регион
При создании регионы по умолчанию пустые, для ввода команд терминала необходимо включить эмуляцию терминала в регионе.

Горячие клавишы для работы с регионами (Ctrl + a + ):

  • c - эмуляция терминала в регионе
  • w - список окон сеанса
  • " - список окон сеанса с возможностью выбора для перехода
  • p - перейти на предыдущее окно
  • n - перейти на следующее окно
  • tab - переход между окнами в многоконном режиме