Страница 1 из 1

GNU Screen и tmux: ключ к эффективному использованию консоли

Добавлено: 27 май 2010, 12:04
Raven
GNU Screen и tmux: ключ к эффективному использованию консоли

Программа с незамысловатым названием 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
Три последних строки файла — ключевые. Первая из них задает способ изменения названий окон. Screen умеет динамически переименовывать окно в зависимости от запущенного в нем приложения. Для этого он использует очень простой способ: читает ввод пользователя в терминале и берет эту строку в качестве имени. Чтобы понять, когда начать чтение ввода, Screen использует запись, указанную в опции shelltitle. В нашем случае это строка '$ |sh', которая означает, что окно будет названо либо именем команды, набранной после символов '$ ' (обычно такими символами оканчивается приглашение командного интерпретатора), либо sh (вариант по умолчанию).

Однако это еще не все. Опция не будет иметь смысла, пока мы не поместим следующую последовательность строк в конец файла ~/.bashrc:

Код: Выделить всё

case $TERM in

screen)

export PROMPT_COMMAND = 'echo -n -e "\033k\033\\"'

;;

esac
Чтобы названия окон были видны на экране, мы создали строку состояния (hardstatus). По меркам Screen она очень проста, но при этом лаконична и вполне достаточна для повседневного использования. Выводимая в ней информация будет выглядеть примерно так:

Код: Выделить всё

12:18 user@hostname [ 0 sh 1 mc 2* irssi ]
Слева будут располагаться текущее время и имя_пользователя@имя_хоста, а справа — имена всех открытых окон в квадратных скобках. При этом текущее активное окно будет помечено звездочкой. Для задания строки статуса Screen использует специальные символы, похожие на те, что применяются для формирования приглашения командного интерпретатора (значение переменной окружения PS1). Прочитав справочную страницу screen, ты сможешь узнать о них подробнее. Последняя строка — назначение клавиши <Esc> на запуск root-терминала.

Теперь после запуска 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
А эта сделает так, чтобы после нажатия <C-a S> окно разделялось на два региона:

Код: Выделить всё

bind S split
А вот пример запуска приложения с помощью клавиатурной комбинации:

Код: Выделить всё

bind m screen -t mail mutt
После нажатия <C-a m> откроется новое окон с именем mail, и в нем будет запущен почтовик mutt. Примерно такой же формат записи можно использовать для запуска приложений сразу после старта Screen:

Код: Выделить всё

screen -t mail 0 mutt

screen -t irc 1 irssi

screen -t google 2 elinks http://www.google.com
Поместив эти строки в конец файла ~/.screenrc и заново запустив Screen, ты получишь сразу три открытых окна с запущенными в них mutt, irssi и elinks.

Не Screen'ом единым

Начиная с версии 4.6 OpenBSD поставляется с собственным вариантом Screen под названием tmux. Как и его GPL-собрат, tmux является терминальным оконным менеджером, который отличается от Screen следующими характеристиками:
  • Клиент-серверная архитектура, при которой окна выполняют роль объектов, которые могут одновременно подключаться к нескольким сессиям, перемещаться между ними и просматриваться с разных клиентов (терминалов).
    Механизм автоматизации выполняемых действий с помощью скриптов.
    Несколько независимых буферов обмена.
    Два варианта раскладки клавиатуры: стиль vi и emacs.
    Более ясный формат описания строки статуса.
    Возможность отображения вывода команды в строке статуса.
    Экономное расходование оперативной памяти.
    Высокая скорость работы.
    Улучшенная поддержка UTF-8.
    Интерактивные меню для выбора окон, сессий и клиентов.
    Более гибкие возможности по разделению окон на регионы.
Несмотря на принадлежность к OpenBSD, tmux способен работать на множестве UNIX-систем, включая FreeBSD, NetBSD, Linux, Mac OS X, Solaris и AIX. Бинарные пакеты tmux уже доступны в репозиториях Debian Sid и Ubuntu Karmic, а исходники могут быть получены с официальной странички tmux в интернете: tmux.sourceforge.net.

Запустив 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 является также и то, что любое действие, выполняемое с помощью клавиатурных комбинаций, можно произвести из командной строки. Например, для перехода к предыдущему окну следует использовать следующую команду:

Код: Выделить всё

$ tmux last-window
А для создания окна такую:

Код: Выделить всё

$ tmux new-window
Весь перечень поддерживаемых команд можно получить так:

Код: Выделить всё

$ tmux list-commands
Команды в tmux играют ключевую роль, с их помощью производится конфигурирование программы, они выступают в качестве аргументов команды bind, предназначенной для переназначения клавиш, и могут быть использованы для автоматизации рутинных действий и управления tmux из другой программы.

Конкретно для конфигурирования tmux предназначены две команды. Одна из них носит имя set-option и служит изменению параметров сессии, вторая называется set-window-option и используется для изменения настроек окон. У них обеих есть сокращенный вариант (set и setw), а также возможность изменять локальные и глобальные опции с помощью флага '-g'. Как и в любой другой программе, проверка первых осуществляется в первую очередь, и, если не установлена локальная опция, значение берется из глобальной. Получить список всех возможных опций можно так:

Код: Выделить всё

$ tmux show-options

$ tmux show-window-options
Более подробно они описаны в man-странице. Воспользуемся этой информацией, чтобы создать небольшой конфигурационный файл:

Код: Выделить всё

$ 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'
Для конфигурирования статусной строки предназначены две опции: status-left и status-right. Первая изменяет левую часть, вторая – правую. В отличие от Screen, их формат очень прост:
#(команда) - результат выполнения указанной команды (первая строка)
#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
Первая строка — сокращенный вариант команды new-session, предназначенной для создания сессии. Вторые две создают окна. Флаг '-d' нужен для того, чтобы после создания окна tmux не сделал его текущим.

Более развитая система разбиения окон на регионы — еще одна отличительная особенность tmux. В отличие от Screen, для разделения окна вертикально на два равных региона используется комбинация <C-b ">, а для переключения между регионами - либо комбинация <C-b o>, либо <C-b> и навигационные клавиши. Изменить размер региона можно с помощью комбинаций <C-b Alt-Up> и <C-b Alt-Down>. Однако основная изюминка скрывается в поддержке нескольких вариантов размещения регионов, для переключения между которыми предназначена комбинация <C-b Space>. В частности, регионы могут быть расположены горизонтально, вертикально, интеллектуально, с выравниванием или без. Это может быть непонятно в теории, поэтому советую просто поэкспериментировать.

Заключение

Консольные менеджеры окон, такие как GNU Screen и tmux, существенно упрощают жизнь в консоли. Они не только позволяют разделить физический терминал между несколькими приложениями, но и создают целую рабочую среду, познакомившись с которой однажды, ты уже никогда не сможешь работать без нее.

Оригинал