среда, 14 марта 2012 г.

Screen – управления окнами из консоли


Иногда приходится работать с *nix серверами удаленно по ssh, в моем случае через putty. Если дисканектит по причине херового интернета, ссесия рвется, то хана всем нашим не завершенным процессам, наработкам в не сохраненных конфигах и.т.д. Что бы предостереч себя от подобных казусов, а так же хранить сессии и в любое время из любого места к ним подключаться я открыл для себя оконный менеджер Screen. Теперь по делу.

Устанавливаем:

#yum install -y screen

 Для начала, освоим основные действия для манипуляции с окнами
Открываем любой эмулятор терминала (в моем случае - это putty) и запускаем в нем Screen:

$ screen


Это окно - первое окно Screen, которое было создано программой автоматически, при ее запуске. Создадим еще одно окно.
Набираем на клавиатуре следующую комбинацию клавиш (везде без -, - это разделитель):
 Ctrl+ac




Запустим в этом окне какой-либо процесс. Пусть это будет top и создаем еще одно окно
 Ctrl+ac и запустим в нем какой-либо процесс. На этот раз путь это будет  man screen
 
На данный момент мы имеем  в одном окне терминала putty три запущенных окна screen.
Как глянуть сколько окон? как вариант Ctrl+aw

Мы видим в левом верхнем углу окна строку:
0$ bash 1*$ bash 2-$ bash

Это список активных, созданных нами окон screen. 0, 1, 2 - это номера окон, а bash - их имена (заголовки). Как видно, нумерация окон начинается с нуля. А вот имена у всех трех одинаковые - bash
 

Окна:
0$ bash - это то, которое Screen сам создал при своем запуске (забегая чуть вперед, можно сказать, что их колличество может быть не одно и выставляется оно в конфигурационном файле);
1-$ bash - в этом окне мы запутили top;
2*$ bash - в этом окне у нас запущен man screen.

Переключение производится сочетанием:
Cntrl+a - p - переключиться на предыдущую вирутальную консоль
Cntrl+a - n или пробел - переключиться на следующую вирутальную консоль
Ctrl+a“ -- интерактивный (в отличие от Ctrl+a – w) список созданных нами окон. Можно перемещаться по нему стрелками вверх-вниз и входить Enter‘ом в нужное.


Можно перейти на нужное окно, зная его номер, по команде:
Ctrl+aномер_окна

Например, перейдем на второе окно: 
Ctrl+a1

Или, чуть переиначив команду:
Ctrl+a

В нижней строке появится предложение ввести номер окна, в которое мы хотим перейти. Допустим, нам нужно перейти в первое окно — вводим номер 0 и нажимаем Enter:

Как мы видели из вывода команд Ctrl+a – w и Ctrl+a – “, имена (заголовки) окон одинаковые. Давайте исправим это. Наберем команду Ctrl+aA

В нижней строке появится приглашение изменить заголовок окна. Исправляем с bash на main и нажимаем Enter. Узнать имя текущего окна можно Ctrl+aN мы увидим в левом верхнем углу окна его имя.

Информацию об окне:
Ctrl+ai

 
Мы увидим в левом верхнем углу окнаинформацию и его имя, в нашем случае имя Main.

Как видно из предыдущих выводов, нумерация окон происходит последовательно, с возрастанием номера: 0 - 1 - 2. Если мы закроем одно из них, нумерация оставшихся окон не изменится.

Закрытие окна в Screen производится выполнением команды exit в окне. Предварительно, нужно остановить все запущенные процессы в нем. Закрытие окон можно произвести и комбинацией Ctrl+a – k. Однако, выполнять ее не рекомендуется, так как эта операция идентична команде kill – “убить” процесс.

Давайте закроем второе окно. Остановим процесс top и выполним exit. А затем посмотрим вывод команды.

Было:

 
Стало:

Видим, что нумерация теперь следующая: 0 — 2. Давайте поменяем нумерацию окон, в частности, окна под номером 2 и присвоим ему номер 1. Выполним команду:
Ctrl+a:
Внизу окна появится приглашение в виде двоеточия для ввода команды.
Введем команду:
number 1
И нажимаем Enter.
Смотрим результат:
Ctrl+a

Cправка по клавиатурным комбинациям Screen:
Ctrl+a?

По умолчанию, Screen отображает только одно окно на экране эмулятора терминала. Однако, имеется возможность разбивать окно Screen в терминале на несколько. Для этого существует команда разбивки окна на горизонтальные части – регионы. Удобство в этом случае заключается в том, что нет надобности переключаться между окнами – все они находятся на виду и все процессы под контролем, достаточно лишь перевести взгляд на нужное окно.
Открываем эмулятор терминала и запускаем в нем Screen и выполняем команду разбивки экрана эмулятора на две горизонтальные части – регионы:
Ctrl+aS

Как видно на скриншоте, окно эмулятора терминала putty было разбито на две одинаковые горизонтальные части. В Screen такие части, выполненные с помощью команды Ctrl+a – S, называются регионами. Таких регионов может быть не обязательно два, а много больше. Допустим, чтобы получить три окна Screen в нашем случае, нужно в текущем регионе (он у нас верхний) снова выполнить команду Ctrl+a – S. Так можно создать три, четыре, пять и т. д. окон Screen. Но мы остановимся на варианте из двух окон, для наглядности.

В верхнем регионе у нас запущен Screen и на этом регионе установлен фокус (зеленый курсор). Нижний регион у нас пуст – в нем не запущен Screen и пока там ничего нет. Нам необходимо перейти на нижний регион, создать там окно Screen и запустить в нем процесс.
Переведем фокус на нижний регион:
Ctrl+aTab
и создадим в нем окно Screen:
Ctrl+ac
У нас появилась командная строка.
Запустим в здесь процесс – top


Теперь переместимся (переведем фокус) опять на верхний регион и запустим там ps -aux.
Снова вводим команду:

Ctrl+aTab
и выполняем:
ps -aux

Получаем:

Закрытие текущего региона в Screen производится командой Ctrl+a – X. Выполним ее в нашем текущем верхнем регионе:
Ctrl+aX

Получим:
Если открыто несколько (больше двух) регионов, можно закрыть сразу все, кроме одного – текущего, выполнив команду:
Ctrl+aQ

и вот еще:
Ctrl+a-| (вертикальное разбиение)

Ctrl+A - d - deattach - отключитсья от окна (но не закрыть)
Ctrl+A - H - записывать в журнал
Ctrl+A - C - (clear) очистить экран.
Ctrl+A - d - (detach) отключить screen от этого терминала.
Ctrl+A - D-D - (pow_detach)  отключиться и разрегистрироваться. 
 
Полезные опции командной строки:
 
-ls и -list
не запускает screen, а показывает вместо этого список идентифицирующих сеансы screen 
строк pid.tty.host. Сеансы, которые отмечены словом "detached" могут быть продолжены 
с помощью команды "screen -r". Сеансы, которые отмечены словом "attached", работают, и 
у них есть управляющий терминал. Если сеанс работает в многопользовательском режиме, 
он отмечен словом "multi". Сеансы, которые отмечены словом "unreachable" или работают на 
другом хосте, или умерли (dead). Недоступный (unreachable) сеанс считается мёртвым, если 
его имя соответствует или имени локального хоста, или указанному параметру (если такой есть).
Как описывать строки для выбора рассказывается в описании ключа -r. Сеансы, отмеченные 
как "dead", нужно проверить и удалить. Если вы не уверены, нужно ли удалять какой-то сеанс,
 вы можете обратиться к системному администратору (если это не вы сами, иначе может 
возникнуть бесконечная рекурсия). Удалить сеансы можно с помощью опции -wipe. 
 
-wipe [match]   
работает также как "screen -ls", только удаляет файлы уничтоженных сеансов вместо того чтобы 
помечать их как "dead" (мёртвые). Сеанс, который не отвечает, считается мёртвым, или если его
имя соответствует имени локального хоста, или указанному явно параметру match. См. описание
ключа -r, где рассказаны правила составления match.   
-r [pid.tty.host]   
-r sessionowner/[pid.tty.host] 
возобновляет работу отключённого сеанса. Никакие другие опции (за исключением комбинаций 
с -d/-D не допускаются). Необязательный параметр [pid.]tty.host может указываться для того
чтобы определить какой именно сеанс из множества отключённых имеется в виду. Вторая форма 
используется для подключения к работающему в многопользовательском режиме сеансу другого 
пользователя. Эта опция говорит о том, что файл нужно искать в каталоге другого пользователя. 
Требует наличия бита setuid-root у программы screen. 
-x 
Подключиться к активной (not detached) сессии screen. (Многодисплейный режим). 
-X 
Отправить указанную команду в работающий сеанс screen.
 
-S sessionname 
Эта опция может использоваться для задания имени сеансу при его создании. Имя используется 
для идентификации при вызове "screen -list" и "screen -r". Оно заменяет префикс "tty.host", 
использующийся по умолчанию. 
 
-A
Адаптирует размеры всех окон под размер текущего терминала. По умолчанию screen пытается 
восстановить старый размер окна (при подключении к терминалам с изменяемыми размерами 
(те у кого есть "WS" в описании, например, suncmd или xterm). 
-d -m 
Запустить сеанс в "отключенном" режиме. Сессия создаётся, но к ней не выполняется 
подключение. Это полезно для загрузочных системных скриптов. 
-D -m
Тоже запускает screen в "отключенном" режиме, но не создаёт новый процесс. Команда 
завершается, если сессия прерывается.

 d|-D [pid.tty.host]

не запускает новый сеанс, а отключает вместо этого уже запущенный ранее. Достигается тот же 
эффект, что и в с случае нажатия клавиш "C-a d" на управляющем терминале screen. Ключ -D 
эквивалентен ключу power detach. Если ни к одному сеансу нельзя обратиться, опция 
игнорируется. В связке с -r/-R могут быть достигнуты другие более интересные эффекты.
 
-d -r 
Подключить к сеансу, и если необходимо, сначала отключить его.  

В каждом сеансе, свои окна! 

Разберем на примере скрипт:

#!/bin/bash
 
'Тут мы направляем комманду exit в ссесию Proga1' 
screen -X -S Proga1 exit
 
 
'Тут мы переходим в каталог program, который находится в нашей домашней дериктории 
и запускаем в "отключенном" режиме ссесию с именем Proga1 и в этой же ссесии сразу 
запускаем nasha_program.sh'
 
cd ~/program/
screen -A -m -d -S Proga1 nasha_program.sh

Т.е. мы создаем сессию с  именем Proga1, но к ней не подключаемся и запускаем в ней программу и если сессия с таким именем уже существует,мы ее сначала закрываем посылая команду exit.

Управление внутри скрина: 
Ctrl+a - c - создание новой вкладки внутри текущей сессии скрина.
Ctrl+a - цифра - переход на  вкладку "номер" в текущей сессии скрина.
Ctrl+a - A - создание имени для текущей вкладки.
Ctrl+a - " - удобное перемещение по именованным вкладкам.
Ctrl+a - d - detach, отсоединение от сессии скрина, выход в обычный баш. Все задачи продолжают выполнятся, но внутри скрина.
Ctrl+d - обычный логауат, как из терминала из . Если вкладка единственная в сессии, текущий скрин завершит работу. Если одна из нескольких, то она закроется, а вы переместитесь в предыдущую вкладку по номеру.
Ctrl+D – выйти из всех сеансов screen

Управление скрином снаружи, из баша.
screen -r - attach, при наличии единственной сессии запущенного скрина - присоединение к ней.
screen -r proc-id  - присоединение к указанной сессии по номеру ее процесса.
screen -ls - распечатка списка текущих запущенных скринов.

Если ссесия запущена с другого терминала (Attached),то можно попробывать -D -R

Тюнинг
Можно так же слегка тюнинговать внешнее отображение виртуальных консолей, для этого создайте в домашней директории файл .screenrc и впишите в него следующее:
caption always
caption string "%{kw}%-w%{wr}%n %t%{-}%+w"
shell -$SHELL
Теперь внизу всегда будет отображаться количество виртуальных консолей и цветное отображение текущей.

Русский MAN ТУТ
Хорошая статья
http://hlabs.org/development/screen
 

2 комментария: