Screen оконный менеджер для терминала

Да, оконный менеджер командной строки, звучит несколько странно, тем не менее, речь пойдет именно о нем.

Программа Screen, является полноценным оконным менеджером для терминала, найти ее можно практически в любой Unix-подобной системе, в данном случае речь как всегда пойдет о Freebsd. Screen позволяет запускать несколько виртуальных терминалов, по умолчанию запускается системная оболочка, в одном физическом терминале и переключаться между окнами, выполняя в каждом, различные задачи.

В чем собственно говоря удобство, небольшой пример из личного опыта. Интернет подключение по ADSL технологии, что подразумевает обрыв связи и переподключение, хоть и автоматически, но раз в сутки стабильно и без согласия кого-либо (особенности ADSL). Занимаясь удаленным администрированием серверов, для собственного удобства, как правило открываю несколько SSH сессий с разными серверами, и может случится неприятная ситуация, когда на одном из серверов компилируется какое-то тяжелое приложение, ядро или мир системы, а на другом например запущен какой-то скрипт выводящий данные в окно терминала, и которые я отслеживаю в реалтайме, ну или производятся какие-то другие работы, не суть важно, вдруг обрывается связь. Конечно можно перенаправлять вывод в файл, но у меня это в привычку не вошло, мне интересней быть в курсе происходящего в системе в данный момент, насколько это возможно конечно в данный момент. В общем по сути, это означает, что никто на 100% не скажет, насколько успешно завершилась операция, запущенная до обрыва связи, а это означает, что нужно переделать/запустить заново, в общем потеря времени и расход нервных клеток. Чем может помочь программа Screen, применительно к вышеприведенному примеру ? Все просто, запускаем screen, для удобства создаем в нем еще пару виртуальных терминалов (окон) с системными оболочками и администрируем себе, сколь душе угодно), в одной у меня например работает вывод vmstat, во второй собирается какой-то софт, а в третей я еще что-то делаю, периодически переключаясь между виртуальными терминалами, отслеживая происходящее. Обрывается связь. После переподключения интернет соединения, коннектимся к серверу, на котором до этого работали, запускаем screen -rd, и вуаля, перед нами снова наш запущенный vmstat в первом окне, процесс компиляции во втором и то что мы делали в третьем, можно спокойно продолжать работать. Теперь ближе к сути. По-умолчанию screen в системе не установлен, напомню, речь идет в контексте операционной системы Freebsd 8-й ветки.
vds-admin /# cd /usr/ports/sysutils/screen
vds-admin /usr/ports/sysutils/screen# make install clean
После установки в каталоге /usr/local/etc появится общесистемный конфигурационный файл screenrc. Если нужно что-бы разные пользователи, могли запускать программу со своими настройками, просто скопируйте этот файл в домашнюю директорию юзера с именем .screenrc. Я не особо заморачиваюсь с настройками, правлю только последнюю секцию, где настраиваются горячие клавиши, все остальное стандартно. Приведу данный кусок своего конфига:
#remove some stupid / dangerous key bindings
bind ^k
bind L
bind ^\
#make them better
bind \\ quit
bind K kill
bind I login on
bind O login off
bind } history

bindkey -k F1 prev
bindkey -k F2 next
В самом screen, почти все сочетания клавиш работают через комбинацию [ Ctrl+a ], то есть сначала нажимаете ее, а уже затем управляющую комбинацию, например, что-бы получить исчерпывающую информацию по всем сочетаниям клавиш, жмем: [ Ctrl+a, ? ] ( имейте в виду, комбинация [ Ctrl+a ], относится и к приведенным в списке сочетаниям ). Приведу наиболее часто используемые мной сочетания клавиш:
F11
Переключение между виртуальными терминалами, предыдущее окно.
F12
Переключение между виртуальными терминалами, следующее окно.
Ctrl+a, Ctrl+C или с
Запустить еще один терминал.
Ctrl+a, d
Отсоединить screen от экрана, вернувшись в физическую консоль. Сам screen при этом никуда не девается и висит в фоне, продолжая выполнять ваши задачи.
Ctrl+a, A
Изменить название окна.
Ctrl+a, k
Убить окно текущее окно терминала (попросит подтверждения).
Ctrl+a, \
Закрыть screen, все виртуальные терминалы будут при это убиты (попросит подтверждения).
Ну и конечно не забываем самое полезное сочетание, во всяком случае на начальном этапе, которое я уже приводил, [ Ctrl+a, ? ]. Что касается самой программы screen, получить краткую подсказку можно с помощью ключа --help:
vds-admin /# screen -help
Use: screen [-opts] [cmd [args]]
 or: screen -r [host.tty]

Options:
-a            Force all capabilities into each window's termcap.
-A -[r|R]     Adapt all windows to the new display width & height.
-c file       Read configuration file instead of '.screenrc'.
-d (-r)       Detach the elsewhere running screen (and reattach here).
-dmS name     Start as daemon: Screen session in detached mode.
-D (-r)       Detach and logout remote (and reattach here).
-D -RR        Do whatever is needed to get a screen session.
-e xy         Change command characters.
-f            Flow control on, -fn = off, -fa = auto.
-h lines      Set the size of the scrollback history buffer.
-i            Interrupt output sooner when flow control is on.
-l            Login mode on (update /var/run/utmp), -ln = off.
-list         or -ls. Do nothing, just list our SockDir.
-L            Turn on output logging.
-m            ignore $STY variable, do create a new screen session.
-O            Choose optimal output rather than exact vt100 emulation.
-p window     Preselect the named window if it exists.
-q            Quiet startup. Exits with non-zero return code if unsuccessful.
-r            Reattach to a detached screen process.
-R            Reattach if possible, otherwise start a new session.
-s shell      Shell to execute rather than $SHELL.
-S sockname   Name this session .sockname instead of ...
-t title      Set title. (window's name).
-T term       Use term as $TERM for windows, rather than "screen".
-U            Tell screen to use UTF-8 encoding.
-v            Print "Screen version 4.00.03 (FAU) 23-Oct-06".
-wipe         Do nothing, just clean up SockDir.
-x            Attach to a not detached screen. (Multi display mode).
-X            Execute  as a screen command in the specified session.
Программа screen может работать сколь угодно долго, пока не будет перезагружен сервер. Если такое случится, в системе останутся мертвые тушки, ранее работавших экземпляров screen, о чем вы будете проинформированы следующим образом:
vds-admin /# screen -rd
There are screens on:
        48273.ttyp5.hostname     (Dead ???)
Remove dead screens with 'screen -wipe'.
There is no screen to be detached.
тут-же предложен вариант избавления от хладных трупов, то есть:
vds-admin /# screen -wipe
Экземпляров самого screen может быть запущено сколько угодно, то есть например, мы запускаем screen, открываем в нем 2 дополнительных окна, затем отцепляем этот экземпляр программы [ Ctrl+a, d ], снова запускаем screen, и снова отцепляем его от экрана. Теперь при попытке присоединиться к запущенному экземпляру screen, будет выведен список этих самых экземпляров:
vds-admin /# screen -rd
There are several suitable screens on:
        47914.pts-2.freebsd88   (Detached)
        48043.pts-2.freebsd88   (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
мы просто коннектимся к одному из них:
vds-admin /# screen -rd 47914
и мы снова при деле. Я редко запускаю более одного экземпляра, что-бы не путаться, но это дело личных предпочтений. Вообще возможности программы screen гораздо шире вышеописанных, здесь я привел лишь основную суть. Что-бы понять все функциональные возможности данного инструмента, полистайте страницы man руководства, найдете не мало интересного. В общем, простой, удобный и главное очень полезный инструмент для удаленного администрирования чего-бы то ни было). Удачи.

Комментарии

[ctrl]+[a] [S]
разделяет экран на 2 горизонтальные полосы (верхняя и нижняя).
[ctrl]+[a] [TAB]
переключаться между ними
Очень полезно для ввода команд в одном "полуокошке", и просмотра логов (tail -f) в другом

[ctrl]+[a] [x]
Блокировка всего screen. Для разблокировки нужно ввести свой пароль.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
Регистр имеет значение
 oooo          .ooooo.    ooooo   oooooooooooo  oooo           .o  
`888 888' `Y88. `888' d'""""""d888' `888 o888
888 .oo. 888 888 888 .888P 888 .oo. 888
888P"Y88b `Vbood888 888 d888' 888P"Y88b 888
888 888 888' 888 .888P 888 888 888
888 888 .88P' 888 d888' .P 888 888 888
o888o o888o .oP' o888o .8888888888P o888o o888o o888o


Введите код, изображенный в стиле ASCII-арт.