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

2021.07.24
При помощи screen можно визуально отслеживать какие-то real-time данные из нескольких терминалов (эмуляций терминалов). А при помощи reptyr можно направить вывод сервиса systemd в терминал сеанса screen и наблюдать вывод. Затем можно открепить сеанс screen и закрыть терминал, при этом сервис systemd продолжит свою работу.

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

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

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

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

Сеансы

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

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

$ screen

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

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

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

$ screen -S name

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

$ 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.

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

Сеансы могут быть в 3 состояниях:

Перейти в detached сеанс (PID - pid процесса или название сеанса):

$ screen -r PID

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

$ 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):

$ screen -d PID

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

$ screen -rD PID

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

$ kill PID

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

$ 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 сеанс нужно очистить следующим образом:

$ screen -wipe PID

Регионы

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

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

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

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

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

В телеграм канале DevOps от первого лица можно оставить комментарий или почитать интересные истории из практики DevOps