LeniH 23.09.2009 18:11

Жизнь в консолиScreen — текстовый оконный менеджер

Screen - это оконный менеджер с эмуляцией терминала VT100/ANSI. Другими словами, это консоль в консоли, т.е. запуская одну терминальную сессию мы можем запустить параллельно несколько команд и наблюдать за их работой. Конечно многие могут сказать, мол зачем нужен какой-то там консольный оконный менеджер, когда уже есть gnome-terminal, konsole и прочие графические эмуляторы терминала, поддерживающие вкладки?






Рассмотрим ситуацию, когда Screen реально необходим. Предположим, что на Вас возложена обязанность удаленно управлять Linux сервером. Тогда, как и всякий другой админ, вы подключаетесь к серверу через SSH и выполняете различные команды. Если вам нужно еще одно окно, то вы создаете еще одно SSH подключение. И все идет хорошо до тех пор, пока сеть нормально функционирует, но однажды может случиться что-то непредвиденное и сеть упадет, причем и ваш локальный компьютер и удаленный сервер будут нормально функционировать, но все удаленные сессию будут потеряны, запущенный программы - убиты, несохраненные скрипты придется писать заново (особенно непрятно когда идет достаточно долгий процесс, который обваливается на самом последнем этапе и все приходится начинать сначала).



Screen



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



screen -dr



Еще одной интересной особенностью Screen-а о которой я недавно узнал, является запись всего вывода консоли в текстовый файл, обычно bash ведет запись списка команд (history), а screen может записывать и вывод который был получен в результате выполнения этих команд. Для того чтобы включить запись нужно нажать в запущенном screen-е Ctrl-a H, а для завершения записи достаточно повторно нажать данное сочетание клавиш. Screen запишет все в файл screenlog.n, где n - целое число соответствующее номеру окна Screen. Обычно я проигрываю полученную "демку" таким набором команд (предположим, что запись происходила с окна под номером 1):



time=0.1

rows=`wc -l screenlog.1 | awk '{print $1}'`

for i in `seq 1 $rows`; do head -$i screenlog.1 | tail -1; sleep $time; done ;

reset




Здесь time - время задержки (чем больше это время, тем медленнее будет происходить вывод "демки")



Рассмотрим основные (повседневные) команды Screen. Для того, чтобы запустить Screen необходимо в терминале набрать команду screen. После чего терминал внешне не изменится (только может быть появится текст с лицензией Screen-а. Для того, чтобы исполнять специальные команды screen-а нужно сначала нажать клавижи Ctrl-a (это некоторый префикс перед всеми командами, его можно изменить с помощью файла конфигурации, но в статье я буду придерживаться идеи то, что именно сочетание клавиш Ctrl-a это префикс для команд Screen-а). Приведем некоторый список часто используемых команд:



Ctrl-a c - создать новое окно Screen

Ctrl-a n - переместиться в следующее окно

Ctrl-a p - переместиться в предыдущее окно

Ctrl-a d - отключиться от текущей сессии screen, при этом все команды продолжат свое выполнение

Ctrl-a K - "убить" выбранное окно (нужно если программа в окне зависла и не хочет умирать самостоятельно)

Ctrl-a " - вывести список всех окон

Ctrl-a A - изменить название текущего окна (удобно, чтобы различать окна между собой, например поставить названия "localhost", "ssh 1.2.3.4" и т.п.



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



Рассмотрим еще одну интересную особенность Screen, а именно назначением "биндингов" на различные сочетания клавиш. Для начала, скажу, что мне казалась нудобной привязка клавиш Ctrl-a как некого префикса, намного лучше будет сделать этим префиксом сочетание клавиш Ctrl-\. Для этого в конфигурационном файле .screenrc необходимо добавить следующую строку:



escape \034\034



Еще мне казалось неудобным каждый раз набирать Ctrl-a n и Ctrl-a p для перемещения по окнам, лучше если это действие будет назначено на функциональные клавиши F1 и F2 соответственно. Для этого в конфиг файл добавляем:



bindkey -k k1 prev

bindkey -k k2 next



Еще было бы интересно назначить на определенные клавиши запуск определенной программы в новом окне. Рассмотрим, как пример запуск Vim-а в окне №5 по комбинации клавиш Ctrl-a e. Для этого нужно добавить в конфиг следующее:



bind e screen -t 'Vim' 5 vim



Еще одной особенностью Screen-а является возможность мониторинга отдельных окон на активность или неактивность. Такая функциональность удобна когда идет длительный процесс компиляции в одном окне а пользователь занимается чем-то в другом и хочет узнать когда компиляция закончится (мониторинг на неактивность) или же когда в одном окне идет наблюдение за выполнением программы (например find) и пользователь хочет узнать когда программа выдаст какие-нибудь строки на терминал (наблюдение за активностью). Для включения этого функционала необходимо нажать следующую комбинацию клавиш:



Ctrl-a M (для слежения за активность)

Ctrl-a _ (для сдежения за неактивность)



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


Тэги: screen terminal vim консоль
+ 17 -
Похожие Поделиться

muhas 23.09.2009 18:18 #
+ 3 -
А про разбиение на регионы? это же делает скрин реальным тайловым манагером для консоли.
Хорошо написал
m0nhawk 23.09.2009 21:56 #
+ 1 -
Использую его в основном на сервере. Что бы компиляция не прервалось, иль ещё что-то.

И вот встал вопрос. Можно ли как-то казать скрину, что бы он в случае одного события при загрузке открывал новое окно и в нем запускал, к примеру, mcabber?
muhas 24.09.2009 09:14 #
+ 0 -
чесно говоря не понял вопроса. но включая режим телепатии думаю в конфиге что-то вроде screen -t mcabber mcabber
m0nhawk 24.09.2009 17:12 #
+ 0 -
Точнее. Я хочу, что бы скрин, если есть инет - в новом окне скрина запускается тот же mcabber.
muhas 24.09.2009 17:37 #
+ 0 -
exec < newcommand >
может поможет, не знаю правда.

Я бы скрипт написал запуска скрина, и если есть инет запускаем screen -t mcabber mcabber
а если нет то просто screen $@ ($ для параметров мало ли параметры какие)
Astramak 23.09.2009 22:12 #
+ 0 -
Только сегодня коллега мне рассказывал про Screen, чудеса )
Спасибо за статью. Буду активно юзать.
or10n 24.09.2009 00:48 #
+ 0 -
а мы под ним microdc2 запускаем по удаленке (само оно в фоне не запускаетццо :( )
andy_shev 24.09.2009 12:23 #
+ 2 -
Как-то страшненько:

for i in `seq 1 $rows`; do head -$i screenlog.1 | tail -1; sleep $time; done ;


Лучше хотя бы так:

cat screenlog.1 | while read x; do echo $x; sleep $time; done;