Жизнь в консоли — Screen — текстовый оконный менеджер
Screen - это оконный менеджер с эмуляцией терминала VT100/ANSI. Другими словами, это консоль в консоли, т.е. запуская одну терминальную сессию мы можем запустить параллельно несколько команд и наблюдать за их работой. Конечно многие могут сказать, мол зачем нужен какой-то там консольный оконный менеджер, когда уже есть gnome-terminal, konsole и прочие графические эмуляторы терминала, поддерживающие вкладки?
Рассмотрим ситуацию, когда Screen реально необходим. Предположим, что на Вас возложена обязанность удаленно управлять Linux сервером. Тогда, как и всякий другой админ, вы подключаетесь к серверу через SSH и выполняете различные команды. Если вам нужно еще одно окно, то вы создаете еще одно SSH подключение. И все идет хорошо до тех пор, пока сеть нормально функционирует, но однажды может случиться что-то непредвиденное и сеть упадет, причем и ваш локальный компьютер и удаленный сервер будут нормально функционировать, но все удаленные сессию будут потеряны, запущенный программы - убиты, несохраненные скрипты придется писать заново (особенно непрятно когда идет достаточно долгий процесс, который обваливается на самом последнем этапе и все приходится начинать сначала).
При использовании 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 реально необходим. Предположим, что на Вас возложена обязанность удаленно управлять Linux сервером. Тогда, как и всякий другой админ, вы подключаетесь к серверу через SSH и выполняете различные команды. Если вам нужно еще одно окно, то вы создаете еще одно SSH подключение. И все идет хорошо до тех пор, пока сеть нормально функционирует, но однажды может случиться что-то непредвиденное и сеть упадет, причем и ваш локальный компьютер и удаленный сервер будут нормально функционировать, но все удаленные сессию будут потеряны, запущенный программы - убиты, несохраненные скрипты придется писать заново (особенно непрятно когда идет достаточно долгий процесс, который обваливается на самом последнем этапе и все приходится начинать сначала).
При использовании 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, работающих с консолью.