GNU Screen и tmux: ключ к эффективному использованию консоли
Добавлено: 27 май 2010, 12:04
Программа с незамысловатым названием GNU Screen остается излюбленным инструментом системных администраторов и UNIX-пользователей со стажем уже на протяжении второго десятка лет. Она настолько популярна, что почти всегда попадает на первое место списков незаменимого арсенала юниксоида. Screen посвящен не один десяток увесистых FAQ и статей, опубликованных в самых авторитетных журналах. Что же в ней такого примечательного?
Что это?
Представь, что у тебя десяток удаленных машин, на каждой из которых поднят SSH-сервер. Каждый день ты подключаешься к ним, чтобы просмотреть логи, оценить работоспособность и загруженность систем. Пока выполняемые тобой задачи не сложны и сводятся к простым действиям в консоли — все в порядке. Однако стоит тебе выполнить сразу несколько действий, как начинаются проблемы. На первых порах спасает комбинация <Ctrl+Z>, но она применима далеко не ко всем приложениям, к тому же со временем ты просто запутаешься в списке фоновых задач, перечисленных в выводе команды jobs. Ты можешь создать дополнительные SSH-соединения в других эмуляторах терминала, но при управлении сразу несколькими машинами это создаст большую путаницу. Что же делать?
Screen способен решить все эти проблемы за счет мультиплексирования терминала между несколькими исполняемыми на удаленной машине процессами. Говоря простым языком, Screen — это консольный менеджер окон, который создает на удаленном конце SSH-соединения нечто вроде мультитабового эмулятора терминала. Ты подключаешься к машине, запускаешь команду screen, которая вновь возвращает тебе приглашение командной строки. Затем ты можешь запустить команду «less /var/log/messages», нажать <Ctrl+A C>, чтобы создать новое окно, запустить в нем команду top, в следующем окне запустить irssi и т.д. В любой момент ты можешь нажать <Ctrl+A P> для возвращения к открытому ранее окну. И все это в рамках одного SSH-соединения.
Однако настоящая мощь Screen заключается в поддержке сессий. В любой момент ты можешь нажать <Ctrl+A D>, чтобы отключиться от Screen и вновь запустить его с ключом 'r', чтобы возобновить прерванную сессию со всеми открытыми окнами и не измененным состоянием приложений. Вся соль в том, что сессия сохранятся на машине-сервере, поэтому неважно, с какой машины она будет возобновлена. Ты начинаешь сессию на работе, затем идешь домой и продолжаешь ее оттуда.
Совсем не обязательно быть системным администратором, чтобы полюбить Screen. Многие старожилы предпочитают использовать его для самых разных вещей, начиная от удаленной проверки почты на домашнем компе с помощью mutt или alpine и заканчивая использованием в качестве удобной консольной среды. Особенно ценным он может оказаться для пользователей устаревших компов, на которых запуск X-сервера сожрет добрую половину памяти, а тяжелые GTK- и QT-приложения — все остальное. К этому же списку можно отнести и нетбуки с процессорами, работающими на низких частотах, и маленькими, как почтовый конверт, экранами (кстати, многотабовые тайловые (фреймовые) менеджеры, наподобие ratpoison, ion3 и dwm, созданы под впечатлением Screen).
Как это использовать?
Не каждый новичок сразу проникнется красотой Screen. И для этого есть две причины. Во-первых, для управления оконным менеджером используется только клавиатура, поэтому чтобы начать его использовать, необходимо знать хотя бы базовые клавиатурные комбинации. Во-вторых, по умолчанию Screen не сообщает пользователю никакой информации об открытых в рамках текущей сессии окнах, именах запущенных в них приложений и т.д., поэтому навигация между окнами усложняется, а при большом их количестве — превращается в кошмар.
Чтобы обойти вторую проблему, мы заранее напишем конфигурационный файл, включающий в себя настройки строки состояния, которая будет выводить на экран различную полезную информацию. Открой файл ~/.screenrc в текстовом редакторе и добавь в него следующие строки:
Код: Выделить всё
$ vi ~/.screenrc
# Отключаем приветствие
startup_message off
# Включаем utf8
defutf8 on
# Использовать визуальный сигнал (мигание экрана) вместо писка динамика
vbell on
# Размер буфера прокрутки
defscrollback 1000
# Производить отключение сессии при разрыве связи с терминалом
autodetach on
# Открывать Login-шелл
shell -$SHELL
# Активировать возможность прокрутки в xterm (и других эмуляторах терминала)
termcapinfo xterm* ti@:te@
# Волшебная строка
shelltitle '$ |sh'
# Строка состояния
hardstatus alwayslastline "%{+b wk} %c $LOGNAME@%H %=[ %w ] "
# По клавише <Esc> создать окно и запустить в нем команду su
bind \033 screen -ln -t root 9 su
Однако это еще не все. Опция не будет иметь смысла, пока мы не поместим следующую последовательность строк в конец файла ~/.bashrc:
Код: Выделить всё
case $TERM in
screen)
export PROMPT_COMMAND = 'echo -n -e "\033k\033\\"'
;;
esac
Код: Выделить всё
12:18 user@hostname [ 0 sh 1 mc 2* irssi ]
Теперь после запуска Screen ты обнаружишь в окне терминала не только безликое приглашение командного интерпретатора, но и информативную строку состояния. Попробуй запустить какую-нибудь интерактивную команду, и ты увидишь, как имя окна изменится.
Перейдем к использованию. Как ты мог заметить, читая введение, все клавиатурные комбинации Screen начинаются с сочетания <Ctrl+A> (<C-a> как его принято называть в документации Screen), за которым следует какая-либо клавиша. Наиболее используемые комбинации это <C-a c> для создания нового окна, а также сочетания клавиш для перехода между окнами. Они перечислены в следующей таблице:
C-a 0..9 переход между окнами 0..9
C-a " показать список всех окон
C-a n перейти в следующее окно
C-a p перейти в предыдущее окно
C-a c создать новое окно
C-a k уничтожить текущее окно
C-a C-a перейти в предыдущее окно
C-a S разделить экран на два региона по горизонтали
C-a | разделить экран на два региона по вертикали
C-a Tab переход между регионами
C-a z склеить два разделенных региона
C-a d отсоединиться от screen
C-a M начать наблюдение за текущим окном
C-a ? справка обо всех комбинациях клавиш
C-a : командная строка Screen
Ты уже знаком с механизмом сессий и комбинацией <C-a d>, добавлю только то, что Screen умеет сохранять и поддерживать сразу несколько сессий. Ты можешь начать сессию для редактирования конфигурационных файлов, затем отключиться от нее, начать новую сессию (просто запустив screen), а затем вернуться к предыдущей. Для этого достаточно передать '-ls' в качестве аргумента команды screen, скопировать имя одной из перечисленных сессий и передать его в качестве опции аргумента '-r'. Более того, тебе никто не помешает подцепиться к уже подключенной с другой машины сессии с помощью аргумента '-x', переданного вместо '-r'.
Очень полезной может оказаться комбинация <C-a M>, предназначенная для наблюдения за выбранным окном. После ее нажатия обо всех происходящих в окне изменениях Screen будет сообщать тебе, даже если в данный момент ты работаешь в другом окне. Это можно использовать, например, для наблюдения за логами или запуска команд под управлением команды watch.
Screen оснащен собственным механизмом копирования и вставки. Комбинация <C-a C-[> переводит оконный менеджер в режим копирования. После этого ты можешь использовать указательные клавиши и пробел для выбора текста и комбинацию <C-a C-]> - для вставки. По нажатию комбинации <C-a h> Screen создает текстовые скриншоты, которые можно просмотреть с помощью штатной утилиты less. Скриншот получает следующее имя: hardcopy.номер_окна.
Если дефолтовые клавиатурные комбинации тебе не подходят, или же ты хочешь создать специальные сочетания клавиш для вызова часто используемых приложений – используй опцию bind конфигурационного файла. Например, следующая строка "повесит" на комбинацию <C-a Space> вывод списка открытых окон:
Код: Выделить всё
bind ' ' windowlist -b
Код: Выделить всё
bind S split
Код: Выделить всё
bind m screen -t mail mutt
Код: Выделить всё
screen -t mail 0 mutt
screen -t irc 1 irssi
screen -t google 2 elinks http://www.google.com
Не Screen'ом единым
Начиная с версии 4.6 OpenBSD поставляется с собственным вариантом Screen под названием tmux. Как и его GPL-собрат, tmux является терминальным оконным менеджером, который отличается от Screen следующими характеристиками:
- Клиент-серверная архитектура, при которой окна выполняют роль объектов, которые могут одновременно подключаться к нескольким сессиям, перемещаться между ними и просматриваться с разных клиентов (терминалов).
Механизм автоматизации выполняемых действий с помощью скриптов.
Несколько независимых буферов обмена.
Два варианта раскладки клавиатуры: стиль vi и emacs.
Более ясный формат описания строки статуса.
Возможность отображения вывода команды в строке статуса.
Экономное расходование оперативной памяти.
Высокая скорость работы.
Улучшенная поддержка UTF-8.
Интерактивные меню для выбора окон, сессий и клиентов.
Более гибкие возможности по разделению окон на регионы.
Запустив tmux, ты сразу заметишь его отличия от Screen. Во-первых, статусная строка активирована по умолчанию и включает в себя почти всю ту информацию, для получения которой в Screen нам пришлось добавлять в конфиг довольно странные строки. Во-вторых, комбинация <C-a> не срабатывает, и вместо нее следует использовать <C-b>. Это не очень удобно, но необходимо в целях устранения конфликтов со Screen (при запуске одного в другом).
За исключением префикса в виде <C-b>, большинство клавиатурных комбинаций совместимы со Screen. Так, <C-b c> открывает новое окно, а <C-b 1> приводит к переходу к окну номер один. В то же время некоторые действия выполняются с помощью других сочетаний клавиш. Например, <C-b w> – это меню открытых окон, <C-b l> – предыдущее окно, <C-b "> – разделить окно по вертикали, уничтожает окно комбинация <C-b &>. Для отключения от сессии используется все та же комбинация <C-b d>, однако для подключения обратно используется другой аргумент командной строки:
Код: Выделить всё
$ tmux attach
Код: Выделить всё
$ tmux last-window
Код: Выделить всё
$ tmux new-window
Код: Выделить всё
$ tmux list-commands
Конкретно для конфигурирования tmux предназначены две команды. Одна из них носит имя set-option и служит изменению параметров сессии, вторая называется set-window-option и используется для изменения настроек окон. У них обеих есть сокращенный вариант (set и setw), а также возможность изменять локальные и глобальные опции с помощью флага '-g'. Как и в любой другой программе, проверка первых осуществляется в первую очередь, и, если не установлена локальная опция, значение берется из глобальной. Получить список всех возможных опций можно так:
Код: Выделить всё
$ tmux show-options
$ tmux show-window-options
Код: Выделить всё
$ vi ~/.tmux.conf
# Изменяем цвет строки статуса на белый
set -g status-bg white
# Изменяем правую часть статусной строки
set -g status-right '#(echo $USER)@#H #(uptime | cut -d "," -f 1)'
# Навигация по командной строке и списку окон в режиме vi
set -g status-keys vi
setw -g mode-keys vi
# Размер буфера истории
set -g history-limit 1000
# Меняем стандартный префикс на <C-a>
set -g prefix C-a
unbind C-b
# Переход к предыдущему окну по <C-a C-a>
bind C-a last-window
# <C-a M> включает мониторинг активности
bind M setw monitor-activity on
# <C-a /> - запустить top
bind / neww 'exec top'
#(команда) - результат выполнения указанной команды (первая строка)
#H - имя хоста
#S - имя текущей сессии
#T - имя текущего окна
## - символ #
Как видно из конфига, я не стал менять левую часть строки, она и без того неплохо выглядит. Однако в правую я поместил информацию о пользователе@хосте, текущем времени и аптайме, который формируется с помощью вызова команд «echo $USER» (имя пользователя), «uptime | cut -d "," -f 1» (время и аптайм) и переменной #H.
Последняя строка файла демонстрирует пример использования команд bind и new-window (neww). Однако последняя может быть применена не только для закрепления функций запуска приложений за клавиатурными комбинациями, но и для создания сессий, например. Помести в конфиг следующие три строки, запусти tmux с опцией attach, и ты получишь три окна, в первом из которых запущен шелл, во втором mutt, а в третьем irssi:
Код: Выделить всё
new -d
neww -d mutt
neww -d irssi
Более развитая система разбиения окон на регионы — еще одна отличительная особенность tmux. В отличие от Screen, для разделения окна вертикально на два равных региона используется комбинация <C-b ">, а для переключения между регионами - либо комбинация <C-b o>, либо <C-b> и навигационные клавиши. Изменить размер региона можно с помощью комбинаций <C-b Alt-Up> и <C-b Alt-Down>. Однако основная изюминка скрывается в поддержке нескольких вариантов размещения регионов, для переключения между которыми предназначена комбинация <C-b Space>. В частности, регионы могут быть расположены горизонтально, вертикально, интеллектуально, с выравниванием или без. Это может быть непонятно в теории, поэтому советую просто поэкспериментировать.
Заключение
Консольные менеджеры окон, такие как GNU Screen и tmux, существенно упрощают жизнь в консоли. Они не только позволяют разделить физический терминал между несколькими приложениями, но и создают целую рабочую среду, познакомившись с которой однажды, ты уже никогда не сможешь работать без нее.
Оригинал