Шейпер трафика под Linux — используем CBQ

CBQ представляет собой систему ограничения трафика по скорости. Это
распространенный шейпер для Linux систем.

Данное описание составлено на основе перевода оригинальной
документации с английского языка.


Простейший трафик шейпер

Для начала рассмотрим простейший случай настройки. По личному опыту —
обычно больше и не надо.

Сама по себе система CBQ представляет собой один исполняемый файл.
Обычно он называется cbq.init и расположен в папке /etc/rc.d. Запуск
осуществляется командой `/etc/rc.d/cbq.init start` а остановка
`/etc/rc.d/cbq.init stop`. Также можно ввести команду
`/etc/rc.d/cbq.init restart` для перезапуска.

Настройка CBQ производится с помощью написания файлов конфигурации
шейперов. Файлы эти обычно располагаются в папке /etc/sysconfig/cbq и
должны иметь имена следующего формата:

cbq-<cbq_id>.

, где:

«cbq-» — эта часть имени обязательна.

<cbq_id> — номер шейпера в системе. Это должно быть шестнадцатеричное
число в диапазоне 2-FFFF (номера 0 и 1 зарезервированы).

— название шейпера. На ваше усмотрение.

Примеры:

cbq-20.director-internet
Cbq-FE03.godzilla

Каждый файл должен содержать строки:

DEVICE=,{Mbit|Kbit|bps}
RATE={Mbit|Kbit|bps}
WEIGHT={Mbit|Kbit|bps}
RULE=[from_addr[/mask][:port],][to_addr[/mask][:port]] …

DEVICE — описание интерфейса

— наименование интерфейса. В Linux’е обычно eth0,
eth1, eth2… или ppp0, ppp1…

— скорость интерфейса
Есть одна тонкость — шейпер может ограничивать только трафик исходящий
с указанного интерфейса. Если надо ограничить входящий трафик —
напишите еще один файл с другим интерфейсом. И еще — если в одном
файле указали «DEVICE=eth0,10Mbit», то в остальных файлах для этого
интерфейса можно писать просто «DEVICE=eth0».

RULE и WEIGHT — параметры шейпера.

— лимит скорости

— погрешность лимита. То есть ограничиваемая скорость будет максимум
RATE+WEIGHT, а как правило — не выше RATE. Обычно величина
WEIGHT принимается 1/10 от RATE.

RULE — это указание от кого к кому (имеются в виду IP-адреса и порты)
работает данное ограничение.

Проще всего понять на примерах:

RULE=192.168.1.0/24:80,81.95.224.64/26:80

ограничивает трафик от подсети 192.168.4.0/24 (адреса
192.168.4.1-192.168.4.254) до подсети 81.95.224.64/26 (адреса
81.95.224.64 — 81.95.224.126) по порту 80 (HTTP).

RULE=192.168.2.1:21,10.0.1.0/24:2021

ограничивает трафик, который идет с порта 21 адреса 192.168.2.1 на
порт 2021 до порта 2021 любого компьютера подсети 10.0.1.0/24 (адреса
10.0.1.1 — 10.0.1.254).

RULE=192.168.4.5:25,

ограничивает весь трафик идущий с адреса 192.168.4.5 по порту 25 куда
угодно (обратите внимание — запятая в конце обязательна).

RULE=192.168.5.0/25:110

ограничивает весь трафик идущий на компьютеры подсети 192.168.5.0/25
(адреса 192.168.5.1 — 192.168.5.126) по порту 110 откуда угодно
(обратите внимание — запятая в начале не нужна).

В файле может быть несколько параметров RULE. При этом ограничивается
трафик по всем RULE сразу, а не для каждого отдельно.

Примеры файлов конфигурации:

Пример 1.

DEVICE=eth0,10Mbit
RATE=64Kbit
WEIGHT=6Kbit
RULE=192.168.1.0/24:8080,10.10.10.0/28:8080
RULE=192.168.75.3,81.95.224.30

Пример 2.

DEVICE=ppp1,56Kbit
RATE=32Kbit
WEIGHT=3Kbit
RULE=192.168.2.2

Трафик, не попадающий ни под одно правило, описанное в файлах — не
ограничивается.

Немного теории

Шейпер работает так: все ИСХОДЯЩИЕ пакеты, т.е. предназначенные для
выдачи на любой интерфейс вместо того, чтобы быть отправляться
напрямую на интерфейс ставятся в разные очереди. Длина каждой очереди
настраивается. Настраиваются также: скорость выдачи данных из очереди
(это и есть собственно лимит), длина очереди (размер в байтах), размер
пакета, выходящего из очереди (может не совпадать с длиной поступающих
пакетов) и многое другое. Пакеты, не помещающиеся в очередь,
сбрасываются. Данные из очереди выдаются на интерфейс и далее — к
клиенту. Вот как раз каждый файл конфигурации и представляет собой
описание одной очереди.

CBQ позволяет также строить иерархические системы очередей. Каждая
очередь может брать данные из выхода другой очереди. Таким образом
очередь может быть дочерней для одной очереди и родительской для
многих других.

Для правильной работы очереди нужно знать следующие данные:

А) Какие пакеты направлять в очередь, а именно:

— пришедшие от каких адресов/портов;
— предназначенные для каких адресов/портов;
— предназначенные для выдачи на какой интерфейс.

Б) Параметры самой очереди, а именно:

— размер очереди в байтах;
— скорость выдачи данных из очереди;
— приоритет очереди;
— размер пакета, выдаваемого из очереди;
— и т.д.

Очереди бывают следующих классов:

— очереди без определенного класса (класс NONE). Если такая очередь
переполняется, то пакеты, не вмещающиеся в нее, остаются в
родительской очереди (если она есть), а если и она переполняется, то
данные, предназначенные для нее, остаются в ее родительской очереди, а
когда и та переполняется — в родительской очереди еще более высокого
уровня и т.д. И только если переполняется самая верхняя очередь
(класса CBQ), то пакет сбрасывается. Однако процесс можно регулировать
параметрами BOUNDED и ISOLATED.

— CBQ — это очереди самого верхнего уровня (они все имеют cbq_id,
равный 1). Их бывает по одной на каждый интерфейс. Создаются
автоматически. В каждую записываются пакеты, предназначенные для
данного интерфейса. Нельзя самому назначать параметры для таких
очередей.

— TBF — очереди со строгим ограничением (термин мой). Пакеты, не
помещающиеся в очередь, просто сбрасываются. Поведение очереди
определяется ее собственными [5]параметрами и от родительской никак не
зависит.

— SFQ — очереди со справедливым распределением (термин мой). В этом
типе очередей лимит родительской очереди распределяется среди дочерних
по особому математическому закону для более справедливого и
равномерного распределения.

Можно создать очередь, динамически меняющую скорость выдачи информации
в зависимости от дня недели и времени суток.

В общем это можно представить как водопроводную систему. На входе —
краны (очереди класса CBQ). Затем трубы разных диаметров и длины.
Длина трубы символизирует в нашем случае размер очереди, а ее диаметр
— скорость выдачи информации. На некоторых трубах есть клапаны на
входе или выходе (параметры BOUNDED/ISOLATED). На трубах также могут
быть вентили (с регулировкой в зависимости от времени суток и дня
недели)(параметры TIME).

Продвинутая настройка

Рассмотрим теперь подробно ВСЕ возможные параметры конфигурационных
файлов.

Интерфейс

DEVICE=,[,] — описание устройства, параметр обязательный

— наименование интерфейса. В Linux’е обычно eth0, eth1, eth2… или ppp0, ppp1…

— скорость интерфейса (10Mbit, 56Kbit, 2Mbit …)

— вес интерфейса (обычно 10% от )

Примечание: — если в одном файле указали «DEVICE=eth0,10Mbit,1Mbit»,
то в остальных файлах для этого интерфейса можно писать просто
«DEVICE=eth0»

Еще раз напомню, что шейпер ограничивает только трафик, исходящий с
данного интерфейса.

Общие параметры для всех классов очередей

RATE={Mbit|Kbit|bps} — скорость выдачи данных с очереди, параметр обязательный

Примеры:

RATE=10Mbit (10 Мбит/с)
RATE=128Kbit (123 Кбит/с)
RATE=3600bps (3600 байт/с) ********** Не бит/с **********

———-
WEIGHT={Mbit|Kbit|bps} — вес шейпера. Обычно 10% от RATE

Примеры:

WEIGHT=1Mbit (1 Мбит/с)
WEIGHT=12Kbit (12 Кбит/с)
WEIGHT=360bps (360 байт/с) ********** Не бит/с **********
RULE=[[saddr[/prefix]][:sport[/mask]],][daddr[/prefix]][:dport[/mask]]

Это фильтр, определяющий, для каких пакетов используется данная
очередь. Параметр обязательный. Он управляет т.н. «u32 filter rules».

saddr — адрес источника (IP).

prefix — маска подсети источника. Указывается не маска в формате
xxx.xxx.xxx.xxx, а число вкл. бит (32-1).
24 соответствует 255.255.255.0, 16 — 255.255.0.0 и т.д.

daddr/prefix — аналогично для адреса назначения.

sport — порт источника (0-65535).

mask — маска для порта (нужна, если надо указать не один порт
, а диапазон протов). Это шестнадцатеричное число формата
0x**** (например 0xfffe — маска на два порта, 0xff00 — на
256 портов). Вообще число портов подряд равно 0xffff минус mask.

dport/mask — аналогично для порта назначения.

Примеры:

RULE=10.1.1.0/24:80
RULE=10.2.2.5
RULE=10.2.2.5:20/0xfffe
RULE=10.5.5.5:80,
RULE=:25,10.2.2.128/26:5000
RULE=192.168.1.0/24:80,81.95.224.64/26:80

Примечание: В файле может быть несколько параметров RULE. При
этом ограничивается трафик по всем RULE сразу, а не для каждого отдельно.

———-
TIME=[,, …,/]-;/[/]

Эти параметры (их может быть несколько в одном файле) дают возможность
назначить разные лимиты скорости в зависимости от дня недели и времени
суток.

— дни недели (0-7, 0=воскресение). Если лимит
действует для нескольких дней, перечислите их
через запятую. Если не указано, то лимит действует на все дни.

— интервал времени в формате ЧЧ:MM-ЧЧ:MM. Указывать обязательно.

— лимит скорости для данного периода (Mbit|Kbit|bps). См. RATE. Указывать обязательно.

— вес лимита для данного периода (Mbit|Kbit|bps). См. WEIGHT. Указывать обязательно.

— пик скорости для данного периода (Mbit|Kbit|bps). См. PEAK. Указывать необязательно.

Примеры:

TIME=0,1,2,5/18:00-06:00;256Kbit/25Kbit
TIME=18:00-06:00;256Kbit/25Kbit

Примечания: 1. Если интервалы времени перекрываются, действует тот,
который описан последним.

2. Если текущее время не попадает ни под одну строку TIME,
используются глобальные параметры RATE, WEIGHT и PEAK

3. Для того, чтобы это все действовало необходимо выполнять команду
`/etc/rc.d/cbq.init timecheck` каждую минуту (если с точностью до минут
надо менять шейпер).

———-
REALM=[srealm,][drealm] — Параметр управляет т.н. «route filter rules».
Параметр необязательный.

srealm и drealm — это должны быть десятичные числа или соответствующие им
строковые значения из файла /etc/iproute2/rt_realms.

Примеры:

REALM=russia,internet от russia до internet
REALM=10 до 10 от всех
REALM=freenet, от freenet до всех
REALM=internet,5 ot internet до 5

———-
MARK= — управляет т.н. «fw filter rules». Параметр необязательный.

— десятичное число — тег для пакетов.

Пример:

MARK=15

Примечание: В одном файле может быть несколько строк MARK.

———-
PRIO= — приоритет шейпера (1-8). 1- максимальный
приоритет. Необязательный параметр. Если не
указать — по умолчанию 5.

Пример:

PRIO=3

———-
PARENT= — номер родительской очереди. Необязательный
параметр. Если не указать — данные берутся
напрямую с очереди типа CBQ соответствующего интерфейса.

Пример:

PARENT=3F00

Примечание: родительская очередь должна быть описана раньше, чем
дочерние. По видимому это означает, что номер ее должен быть меньше.

———-
LEAF=none|tbf|sfq — класс очереди. Можно создавать очереди
класса TBF или SFQ, а также очереди без
класса. Указывать необязательно, по умолчанию tbf.

Пример:

LEAF=sfq

———-
BOUNDED=yes|no — ограничение. Если поставить yes, то пакеты при переполнении
очереди не остаются в родительской, а сбрасываются. Указывать необязательно, по умолчанию yes

Пример:

BOUNDED=yes

Примечание: Для TBF — очередей всегда yes (даже если прямо указать no).

———-
ISOLATED=yes|no — изоляция. Если поставить yes на родительской очереди,
то все дочерние будут работать как будто у них BOUNDED=yes, то есть
без резервирования. Указывать необязательно, по умолчанию «no»

Пример:

ISOLATED=yes

Параметры для очередей класса TBF

LIMIT=[{Mb|Kb}] — длина очереди в мегабайтах (Mb),
килобайтах (Kb) или в байтах, если не указана единица.
Указывать необязательно, по умолчанию 15Kb.

Примеры:

LIMIT=10Kb
LIMIT=1Mb
LIMIT=65535

———-
PEAK={Mbit|Kbit|bps} — максимальная пиковая скорость выдачи информации
из очереди. Только на короткое время. Параметр необязателен.

Примеры:

PEAK=10Mbit (10 Мбит/с)
PEAK=128Kbit (123 Кбит/с)
PEAK=3600bps (3600 байт/с) ********** Не бит/с **********

———-
MTU= — размер выходного пакета, исходящего из очереди.
Необязательный параметр, если не указать, то такой, как MTU на интерфейсе
(для Ethernet — 1500). Имеет смысл указывать, когда задан параметр PEAK.

Пример:

MTU=1024

———-
BUFFER=[{Mb|Kb}][/] — размер буфера.

— Это максимальное число байт (Кбайт, Мбайт), которое
может быть выдано из очереди за один раз.

— я не понял. В оригинале — parameter is used to
determine the Length of intervals in packet sizes,
for which the transmission times are kept.

Параметр указывать необязательно, по умолчанию 10Kb/8.

Параметры для очередей класса SFQ

QUANTUM= — значение не может быть меньше MTU. Что означает — не знаю.
В оригинале тоже ничего не сказано. Это необязательный параметр.

Пример:

QUANTUM=1514

———-
PERTURB= — период пертурбации hash-функции в секундах.
По умолчанию 10. Если не указать, пертурбация никогда не происходит.
Назначение непонятно.

Пример:

PERTURB=15

Еще раз хочу напомнить, что настройки каждого файла действуют только
на трафик, исходящий с интерфейса, описанного в параметре DEVICE.

Команда cat

Команда cat, без сомнения, одна из самых употребительных. С ее помощью просматривают содержимое текстовых файлов.

Если набрать в командной строке слово cat и нажать клавишу ENTER, то можно набирать текст и видеть его на экране монитора. Повторное нажатие клавиши ENTER удваивает строку и позволяет начать следующую. Когда текст набран, следует одновременно нажать клавиши CTRL и d.


Continue reading

ack-grep — удобный поиск в текстовых файлах

Для поиска текста в текстовых файлах можно использовать grep, но есть и более удобный вариант, разработанный специально для программистов — ack-grep.

Впрочем, использовать его могут все пользователи Linux систем ). 


Поиск текста в файлах с ack-grep

Предположим, вам нужно найти, в каких файлах, находящихся в каталоге ~/.virtualenvs/barons/lib/python2.7/site-packages/zinnia/, упоминается  _entry_detail.html

Для поиска текста в файлах выполните команду:

ack-grep -r _entry_detail.html ~/.virtualenvs/barons/lib/python2.7/site-packages/zinnia/

Вывод ack-grep

Поиск текста с ack-grep

...
/home/sharm/.virtualenvs/barons/lib/python2.7/site-packages/zinnia/tests/mixins.py
151: ['zinnia/archives/2012/04/21/my-fake-entry_entry_detail.html',
152: 'zinnia/archives/month/04/day/21/my-fake-entry_entry_detail.html',
153: 'zinnia/archives/2012/day/21/my-fake-entry_entry_detail.html',
154: 'zinnia/archives/day/21/my-fake-entry_entry_detail.html',
163: 'zinnia/archives/2012/month/04/my-fake-entry_entry_detail.html',
164: 'zinnia/archives/month/04/my-fake-entry_entry_detail.html',
169: 'zinnia/archives/2012/my-fake-entry_entry_detail.html',
172: 'zinnia/archives/my-fake-entry_entry_detail.html',
173: 'zinnia/my-fake-entry_entry_detail.html',
174: 'my-fake-entry_entry_detail.html',

Очень удобно — видны все вхождения, искомый текст подсвечен. То, что надо!

Screen — несколько экранов в одной SSH сессии

Screen — очень удобная программа, если вы часто работаете в консоли, подключившись к серверу по SSH. В таком случае screen позволяет держать в одной консоли несколько разных экранов, удобно переключаясь между ними.

Screen позволяет отключиться от SSH, сохранив выполеняющиеся на удаленном сервере задания.


Установка screen

Для установки на Ubuntu нужно выполнить команду

$ sudo apt-get install screen

После этого нужно запустить screen:

$ screen

После запуска вы увидите либо приглашение командной строки, либо «экран приветствия», нажав SPACE или ENTER в котором, вы так же попадете в shell. При этом все команды будут запущены уже «внутри» screen’а.

Для того, чтобы выйти из screen’а (выйти, а не отсоединиться) достаточно выйти из всех открытых в нем оболочек, либо же, нажать комбинацию клавиш Ctl-a \, и ответить «y» на вопрос «действительно ли вы хотите выйти».

Отсоединиться от текущего скрина, не закрывая и не завершая сессии, можно комбинацией Ctrl-a d.

Подключение к screen

Если на машине уже есть запущенная screen-сессия, и вы хотите подсоединиться к ней, то

  1. если сессия одна, достаточно просто команды:
    $  screen –x
  2. если сессий несколько, то: посмотреть список запущенных screen’ов можно командой screen -ls:
     
    $  screen -ls
    There are screens on:
            2762.pts-0.debian       (Detached)
            2743.pts-0.debian       (Detached)
    2 Sockets in /var/run/screen/S-diesel.

    Выбираем нужный нам screen, и присоединяемся к нему:

     screen -x 2762.pts-0.debian

    Названия сессий по-умолчанию малоинформативны — просто номера процессов, если есть желание запустить и использовать несколько screen-сессий для разных задач, можно придумать более вменяемые названия. Придумываем название, затем запускаем новый screen вот таким образом:

      $  screen -S "job1"

    где job1 — это название нашей «именнованной» сессии. Теперь в -ls мы увидим гораздо более понятное:

     
    $  screen -ls
    There are screens on:
            2762.pts-0.debian       (Detached)
            2795.job1       (Detached)
            2743.pts-0.debian       (Detached)
    3 Sockets in /var/run/screen/S-diesel.

    и сможем подсоединиться к сессии job1, просто указав ее имя:

    $  screen -x job1

Переключение между окнами screen

Как вы уже поняли, сессии сохраняются даже в то время, когда вы отключны от сервера, и все что в них запущено, продолжает выполняться. Впрочем, на этом возможности screen’а не исчерпываются. Иногда, при работе по ssh, очень хочется, чтобы было открыто сразу несколько терминалов, при этом коннектиться несколько раз облом — особенно если коннектиться нужно через несколько серверов. В этом тоже может помочь screen. Просто нажмите Ctrl — a c, и откроется еще один шелл. Перемещаться между открытыми шеллами можно либо через Ctrl — a <Цифра>, где <Цифра> — номер открытого шелла, начиная с нуля, либо Ctrl — a n/Ctrl — a p — вперед назад. Получить список открытых «окон» – консолей (и переключиться на нужную), можно комбинацией клавиш Ctrl — a «; чтобы задать нормальное имя (а не просто скучный «bash») для какого-нить окна, перейдите в него и нажмите Ctrl — a A (регистр имеет значение), затем в появившемся приглашении введите имя.

Мониторинг выполнения команды

Если открыто несколько окон, полезной может быть возможность следить за активностью в каком-то из них. Например, если вы запустили «долгоиграющую» команду и интересно узнать, когда она завершится. Переходим в окно с этой командой, жмем Ctrl — a m, видим надпись типа такой: «Window 0 (bash) is now being monitored for all activity». Когда что-то в окне изменится, screen подаст звуковой сигнал, а в списке окон после номера появится символ «@».

Прокрутка экрана в screen

Для просмотра вывода команды, который ушел выше границ окна, нужно нажать Ctrl-a [

Это переключит screen в Copy mode. Для выхода из этого режима просто нажмите Esc.

Конфигурация screen

Конфигурируется screen с помощью файла ~/.screenrc, в вашем домашнем каталоге. Например, можно написать туда:

caption always "%{= 45}%{+b w}Screen: %n | %h %=%t %c"
hardstatus alwayslastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<"

Это даст вам все время видимый список открытых окон, и другую полезную информацию внизу экрана.

Также при запуске Screen по-умолчанию выполняются команды из файла /etc/screenrc и файла .screenrc из домашнего каталога пользователя. Многие команды которые можно использовать в файлах конфигурации были рассмотрены в таблицах выше в поле «Текстовая команда». Ниже представлен пример конфигурации Screen из файла .screenrc:

# Отключить вывод лицензионной информации при старте Screen
startup_message off

# Открыть оболочку для работы
chdir
screen -t Work

# Открыть оболочку для управления конфигурацией
chdir /etc
screen -t Configuration

# Открыть оболочку для просмотра логов
chdir /var/log
screen -t Logs

# Выбрать первое окошко после старта
select 0

Этот достаточно простой файл конфигурации открывает три окна с именами Work, Configuration, Logs, соответственно в личном каталоге пользователя, в каталоге/etc и каталоге /var/log. После запуска на экране будет находиться первое окно с именем Work. На рисунке 1 представлен пример работы Screen с этим файлом конфигурации.

Завершение Screen

Если по какой-то причине сессия screen перестает отвечать, можно завершить ее. Для этого нужно подключиться к нужной сессии, затем нажать Ctrl — a и ввести команду «:quit».

Screen завершит работу данной сессии, принудительно закрыв все окна.

Работа со Screen

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

На рисунке изображен Screen с тремя именованными окнами (Work, Configuration, Logs) и открытый в нем текстовым редактором Vim, с примером файла конфигурации Screen.

Первый запуск

Screen может быть запущен с помощью консольной команды screen, но прежде всего проверим установлен ли Screen в вашей системе с помощью следующей команды:

$ which screen
/usr/bin/screen

Если команда вернула путь как в примере выше, можно сразу начинать пользоваться, в противном случае Screen может быть установлен стандартными средствами поддержки пакетов вашей операционной системы, или скачан с официального сайта http://www.gnu.org/software/screen/ .

Теперь мы можем запускать Screen, для чего просто набираем:

$ screen

После запуска на экран может появиться информация о версии и лицензии (при рассмотрении конфигурации мы рассмотрим, как можно отменить вывод данного сообщения) и в этом случае необходимо нажать клавишу «Пробел» или «Ввод», после чего мы попадаем в, на первый взгляд обычную, текстовую оболочку. Надо заметить, что в командной строке сразу можно указать команду для запуска определенного приложения, например, для запуска top надо набрать:

$ screen top

Хорошо, теперь Screen запущен, но, на первый взгляд, нет никаких внешних изменений — мы можем работать в запущенной оболочке, или использовать top.Хитрость в том, что во время работы Screen передает все нажатия клавиш непосредственно приложению, но (по умолчанию) оставляет для себя управляющие команды, начинающиеся с комбинации клавиш Ctrl + a.

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

КЛАВИШНАЯ КОМБИНАЦИЯ ТЕКСТОВАЯ КОМАНДА ОПИСАНИЕ
Ctrl + a : colon Вывести приглашение для ввода текстовых команд в интерактивном режиме

В данном случае мы должны выполнить две клавиатурные комбинации сначала нажав Ctrl + a и затем клавишу двоеточия. При этом Screen выведет в нижней части экрана приглашение для ввода команды в виде двоеточия. Ту же самую команду, которую мы только что выполнили с помощью клавишной комбинации, можно выполнить через конфигурационный файл с помощью текстовой командыcolon, что может, например, понадобиться для вывода приглашения о вводе команд при старте, или переназначении комбинации клавиш, вызывающих это приглашение. Ниже, как и в примере выше, для каждой клавишной комбинации я буду писать соответствующие им ключевые слова, которые можно использовать в файлах конфигурации, или вводить с помощью Ctrl + a и :.

Здесь может возникнуть закономерный вопрос — а что, если приложению нужно непосредственно передать комбинацию клавиш Ctrl + a, которая уже используется в Screen как служебная? Например, такая же комбинация используется библиотекой редактирования командной строки readline для выполнения перехода в начало строки. Для этого случая в Screen предусмотрена следующая команда:

КЛАВИШНАЯ КОМБИНАЦИЯ ТЕКСТОВАЯ КОМАНДА ОПИСАНИЕ
Ctrl + a a meta Передать текущему предложению клавишную комбинацию Ctrl + a

Управление окнами

В предыдущем разделе мы научились запускать Screen и выучили основной шаблон для всех клавишных команд. Пришло время разобраться с командами для управления окнами. При запуске Screen создает одно окно (если только в конфигурации не указано создание сразу нескольких окон) и присваивает ему номер 0. Новое окно с командной оболочкой можно создать с помощью команды ниже:

КЛАВИШНАЯ КОМБИНАЦИЯ ТЕКСТОВАЯ КОМАНДА ОПИСАНИЕ
Ctrl + a c screen Создать новое окно

При этом Screen создаст новое окно и присвоит ему следующий по порядку номер.В нашем случае новым окном будет окно с номером 1.

Теперь у нас есть уже два текстовых окна, из которых текущим является только что созданное окно с номером 1, а окно с номером 0 находится в фоновом режиме. Но, надо заметить, что даже если окно находится в фоновом режиме, оно может воспринимать вывод запущенного в нем приложения, как если бы оно было текущим. Например, мы могли бы запустить в окне 0 процесс, который выводит дополнительную информацию через определенные промежутки времени (для примера это может быть команда tail -f) и затем переключиться в окно 1 для работы в текстовом редакторе. Через какое-то время, если мы захотим посмотреть, что происходит в окне 0, мы можем переключиться в это окно и увидеть весь вывод работающего там процесса. Затем можно переключиться обратно в окно редактирования.

В предыдущем параграфе я описал пример с переключением между окнами, но пока не сказал какие команды для этого используются. Рассмотрим подробнее наиболее часто используемые команды для управления окнами:

КЛАВИШНАЯ КОМБИНАЦИЯ ТЕКСТОВАЯ КОМАНДА ОПИСАНИЕ
Ctrl + a w windows Выводит список номеров и заголовков всех окон в нижней строчке экрана
Ctrl + a « windowlist Выводит интерактивный список номеров и заголовков всех окон из которого можно выбрать окошко для переключения
Ctrl + a Номер окна select Выбор окна по номеру. Например, команда Ctrl + a и 0 делает текущим окно с номером 0
Ctlr + a n next Переключиться на следующее по порядку окно, или на первое окно если мы находились в последнем окне
Ctrl + a p prev Переключиться на предыдущее по порядку окно, или на последнее окно если мы находились в первом окне
Ctrl + a select Вывести приглашение ввода номера окна для переключения
Ctrl + a Ctrl + a other Переключиться на последнее использованное окно
Ctrl + a N number Показать номер и заголовок текущего окна
Ctrl + a A title Установить заголовок текущего окна
Ctrl + a k kill Принудительное закрытие окна, например, в случае если приложение не удается закрыть обычным способом

При закрытии какого-либо из окон номера других окон не меняются и в нумерации появляются «дырки», которые позднее могут быть заполнены новыми окнами.Хотя Screen имеет команду для изменения номера окна, она здесь не рассматривается и остается для самостоятельного изучения. В случае, если закрыты все окна, Screen завершает свою работу и выводит сообщение:

[screen is terminating]

Работа с текстом

Выше мы научились запускать Screen и управлять окнами — создавать их, переключаться от окна к окну, присваивать имена и закрывать. Теперь рассмотрим работу с содержимым окон — копирование и вставку текстового содержимого одного окна в другое, мониторинг окон, сохранение текстовой копии экрана и другие похожие задачи:

КЛАВИШНАЯ КОМБИНАЦИЯ ТЕКСТОВАЯ КОМАНДА ОПИСАНИЕ
Ctrl + a M monitor Включить/выключить мониторинг активности для текущего окна. Когда мониторинг включен и в окне находящемся в фоновом режиме производится вывод текста, в служебной строке выводится информация об активности.
silence Включить/выключить мониторинг отсутствия активности для текущего окна. Когда мониторинг включен и в окне находящемся в фоновом режиме некоторый период времени не производится вывод текста в служебной строке выводится информация об отсутствии активности.
Ctrl + a h hardcopy Записать текстовое изображение текущего окна в файл hardcopy.номер_окна в каталоге Screen по умолчанию.
Ctrl + a H log Включить/выключить трассировку текста текущего окна в файл screenlog.номер_окна в каталоге Sccreen по умолчанию.
Ctrl + a [ copy Войти в режим копирования. Дополнительные команды этого режима описаны ниже.
Ctrl + a ] paste Вставить в окно текст из регистра по умолчанию (куда он предварительно был скопирован с помощью команды выше).

В режиме копирования Screen запускает текстовый редактор похожий на редактор Vi. Наиболее часто используемые команды редактора:

  • Клавиши управления курсором перемещают курсор по экранному буферу;
  • Клавиша «Пробел» отмечает начало и конец региона для копирования. При втором нажатии «Пробел», отмеченный текст копируется в регистр по умолчанию, и Screen выходит их режима копирования;

Несколько окон на экране

По умолчанию Screen оставляет видимым на экране только одно логическое окно, но при желании есть дополнительная возможность разделить экран терминала на горизонтальные регионы. Таким образом, можно отображать сразу несколько окон на одном экране терминала. Рассмотрим подробнее команды для работы с регионами экрана:

КЛАВИШНАЯ КОМБИНАЦИЯ ТЕКСТОВАЯ КОМАНДА ОПИСАНИЕ
Ctrl + a S split Разделить текущее окно, или регион на два новых региона. При этом размеры всех регионов меняются для получения дополнительного пространства на экране и в новом регионе отображается пустое окно.
Ctrl + a Tab focus Переместить текущий фокус отображения на регион ниже, или на верхний регион если текущим является самый нижний регион.
Ctrl + a Q only Закрыть все регионы кроме текущего
Ctrl + a X remove Закрыть текущий регион

На рисунке 2 изображен Screen с тремя именованными окнами (Work, Configuration, Logs) и разделенным на два региона экраном. В верхнем регионе открыто окно Work с текстовым редактором Vim и примером файла конфигурации Screen. В нижнем регионе окно Configuration с частью общего файла конфигурации /etc/screenrc.

Консольные сессии

И в завершение, мы рассмотрим одну из самых популярных возможностей Screen.Представим следующую ситуацию: системный администратор, находясь дома, заходит на удаленный сервер, открывает несколько окон, запускает необходимые задачи, затем закрывает соединение и едет на работу. На работе он опять заходит на тот же сервер и восстанавливает открытые дома окна с результатами выполненных задач. Звучит немного фантастично? Ни в коем случае! Консольные сессии Screen как раз и предназначены для осуществления этой задачи. Они позволяют отсоединить от терминала текущую сессию Screen со всеми окнами и выполняемыми приложениями и, затем в любой момент времени присоединиться к ней опять. При этом все выполняемые под Screen приложения будут продолжать работать и использовать свои окна для вывода информации. Плюс ко всему консольных сессий может быть несколько, но в этой статье мы не будем на этом подробно останавливаться.

Рассмотрим команды отсоединения консольной сессии от терминала:

КЛАВИШНАЯ КОМБИНАЦИЯ ТЕКСТОВАЯ КОМАНДА ОПИСАНИЕ
Ctrl + a d detach Отсоединить консольную сессию и оставить ее запущенной в фоновом режиме. При этом Screen пишет:[detached]
Ctrl + a D D pow_detach Отсоединить консольную сессию, оставить ее запущенной в фоновом режиме и послать родительскому процессу Screen сигнал HANGUP. При запуске Screen из удаленного терминала это означает отсоединение Screen и затем закрытие соединения. При этом Screen пишет:[power detached]
Ctrl + a z suspend Отсоединить консольную сессию и оставить ее запущенной как фоновый процесс родительской командной оболочки. В этом случае для восстановления сессии кроме команд описанных ниже могут быть использованы стандартные команды управления фоновыми процессами командной оболочки
Ctrl + a Ctrl + quit Закрыть все окна сессии и выйти из Screen.Надо заметить, что многие дистрибутивы переопределяют клавишную комбинацию для этой команды, но текстовую команду можно использовать в любом случае

Чтобы присоединиться обратно к отсоединенной сессии, или посмотреть список доступных сессий, необходимо запустить Screen с одним из следующих ключей:

КОМАНДА ДЛЯ ЗАПУСКА SCREEN ОПИСАНИЕ
screen -r Присоединиться к отсоединенной сессии.
screen -R Присоединиться к первой подходящей отсоединенной сессии.Это может быть полезно в случае если используется несколько сессии.
screen -x Присоединиться к уже работающей сессии.
screen -ls Вывести список доступных сессий.

Что дальше?

Screen имеет огромное количество различных возможностей и, практически, невозможно описать их все в одной статье, поэтому некоторая часть функциональности осталась «за кадром». Вот некоторые возможности/настройки Screen, которые не были рассмотрены выше и остаются для самостоятельного изучения:

  • Команды настройки эмуляции терминала;
  • Многопользовательские консольные сессии;
  • Назначение, или переназначение командам клавишных комбинации;
  • Вспомогательные опции текстовых команд. Например, опция -t команды screen, которая используется в примера файла конфигурации;
  • Редко используемые команды, например, команды, которые можно использовать при настройке запуска Screen — echo и sleep;
  • Переменные среды, которые могут быть полезны при настройке Screen;
  • Дополнительные ключи запуска Screen;

Альтернативы screen

Screen — это программа с большой историей, надо заметить, что первая версия появилась в 1987-м году. На данный момент, к Screen, практически, не добавляется новых возможностей (одной из причин может быть наличие уже большого их количества на данный момент) и производится, в основном, только исправление ошибок. Если кому-то не нравится относительная «старость» Screen, или не нужно такое большое количество возможностей, то можно обратиться к одной из следующих программ:

  • dtach (http://dtach.sourceforge.net/ ) — основной акцент при разработке этой программы сделан на компактность. По аналогии со Screen она поддерживает возможность работы с консольными сессиями, но не имеет других возможностей Screen.
  • SplitVT (http://www.devolution.com/~slouken/projects/splitvt/ ) — позволяет разделать экран терминала на две половинки и работать сразу с двумя программными оболочками.
  • Tmux (http://sourceforge.net/projects/tmux ) — для работы с консольными сессиями Tmux использует модель клиент-сервер.
  • Twin (http://linuz.sns.it/~max/twin/ ) — попытка создать текстовый оконный интерфейс аналогичный графическим собратьям