Компьютерная грамотность, помощь и ремонт

Запуск и основы работы Screen. Screen – управления окнами из консоли Ubuntu screen разные пользователи

Screen - это полноэкранная программа, работающая в текстовом режиме, которая позволяет в одной консоли (или ssh-сессии) иметь несколько виртуальных экранов с независимо выполняющимися в них программами. Т.е. программа screen позволяет открыть несколько терминальных сеансов в одном окне терминала. Программа screen может быть очень полезной в том случае, если, например, вы работаете с несколькими программам в интерфейсе командной строки и вам необходимо чтобы они выполнялись одновременно, в независимых сессиях и требуется возможность переключения между ними. Также, программа screen дает возможность передать одну сессию другому пользователю.

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

Для rpm-based дистрибутивов (RedHat, CentOS, Fedora, итп) выполните:

Для deb-based дистрибутивов (Debian, Ubuntu, итп) выполните:

# apt-get install screen (On Debian based Systems)

Запуск screen в первый раз

Для запуска команды screen просто выполните:

Вывод информации о клавиатурных сокращениях

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

Нажмите "Ctrl+A" и, затем, "?" (без кавычек). На экран будут выведены клавиатурные сокращения:

Для выхода нажмите "пробел" или "Enter"

Отключение экрана screen

Важнейшим преимуществом команды screen является функция отсоединения экрана с последующей возможностью подключения (при этом выполнение программ не прерывается).

Например, это может понадобится в том случае, если вы работаете по ssh на удаленной машине, и вам необходимо скачать объемный файл с помощью команды wget, на что потребуется, например, 2 часа. В том случае, если вы закроете ssh-сессию по собственному желанию или случайно по причине разрыва соединения процесс загрузки также прервется. Соответственно, вам придется вручную запускать загрузку заново. Избежать такой проблемы как раз поможет команда screen.

В первую очередь, запустите команду screen:

Затем запустите команду, которая занимает длительное время. Например, это может быть обновление системы или, как сказано выше, процесс загрузки большого файла:

wget http://mirror.yandex.ru/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-minimal.iso

Во время процесса загрузки нажмите комбинацию клавиш "Ctrl+A" и затем "d" (также можно "Ctrl+D"). При нажатии этих клавиш на экран ничего выведено не будет, только после того, как будет выполнено отключение экрана вы увидите подобное:


$

Подключение отключенного экрана screen.

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

Вы увидите, что процесс, который вы запустили все еще работает.

В том случае, если вы запустили и оставили отключенными более чем одну сессию screen вам будет необходимо указать ID этой сессии. Для того, чтобы посмотреть, сколько сессий было запущено выполните:

Вывод будет примерно таким:

There are screens on:
7938.pts-0.howtoitru (Detached)
7724.pts-0.howtoitru (Detached)
2 Sockets in /var/run/screen/S-howtoitru

Если вы хотите восстановить сессию 7724.pts-0.howtoitru выполните:

Использование нескольких сессий screen

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

  • отключение экрана и подключение к другому (как описано выше)
  • переключение между "вложенными" экранами, не завершая команду screen

Для второго способа необходимо запустить команду screen и нажать "Ctrl-A" и "c" для создания следующего вложенного экрана. Переключение между экранами производится командами "Ctrl-A" и "n"(следующий экран) и "Ctrl-A" и "p"(предыдущий экран).

Запись (логирование) выполняемых команд.

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

Для запуска функции логирования нажмите "Ctrl-A" и "H" (обратите внимание на регистр символа "H", т.к. если вы выполните команду "h" будет создан скриншот экрана вместо записи действий). Все ваши действия и выводы на экран будут записаны в файл screenlog.0 в вашей домашней директории.

Для прекращения записи опять выполните "Ctrl-A" и "H".

Также можно активировать запись запусти команду с параметром -L:

Блокировка экрана

Существует возможность блокировки экрана с помощью сочетания клавиш "Ctrl-A" и "x". При блокировке на экран будет выведено:

Screen used by howtoitru onhowtoitru.
Password:

Завершение сессии screen

Для завершения сессии (полного, а не отключения, выполняемого командой "Ctrl+A" и "d") выполните обычную команду выхода:

Также можно использовать сочетание клавиш "Ctrl+A" и "k" для завершения сесии.

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

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

#yum install -y screen

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


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

Запустим в этом окне какой-либо процесс. Пусть это будет top и создаем еще одно окно
Ctrl+a c и запустим в нем какой-либо процесс. На этот раз путь это будет man screen

На данный момент мы имеем в одном окне терминала putty три запущенных окна screen.
Как глянуть сколько окон? как вариант Ctrl+a w

Мы видим в левом верхнем углу окна строку:
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+a 1

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

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

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

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

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

Мы увидим в левом верхнем углу окнаинформацию и его имя, в нашем случае имя 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+a S

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

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

У нас появилась командная строка.
Запустим в здесь процесс – top


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

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

Получаем:


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

Получим:

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

И вот еще:
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 работает также как "screen -ls", только удаляет файлы уничтоженных сеансов вместо того чтобы помечать их как "dead" (мёртвые). Сеанс, который не отвечает, считается мёртвым, или если его имя соответствует имени локального хоста, или указанному явно параметру match. См. описание ключа -r, где рассказаны правила составления match. -r -r sessionowner/ возобновляет работу отключённого сеанса. Никакие другие опции (за исключением комбинаций с -d/-D не допускаются). Необязательный параметр 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 не запускает новый сеанс, а отключает вместо этого уже запущенный ранее. Достигается тот же эффект, что и в с случае нажатия клавиш "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 Теперь внизу всегда будет отображаться количество виртуальных консолей и цветное отображение текущей.

Вы залогинились на ваш удаленный сервер через ssh, радостно стучите по клавиатуре, делая свои какие-то админские дела и опа! Символы перестали печатться и вывалилось то самое сообщение, которое, порой, вызывает непреодолимое желание разбить клавиатуру. Connection closed. Знакомая ситуация? Да-да, ваша сессия только что аварийно оборвалась и все придется делать заново… Этого можно избежать, если использовать screen. Он не только позволит сохранить вашу сессию в целости и сохранности, но еще и позволит держать открытыми несколько сессий в одном окошке терминала

Что такое screen?
Сначала посмотрим man-страницу: “Screen - это полноэкранный оконный менеджер, который позволяет разделить физический терминал между несколькими независимыми процессами (обычно интерактивными облочками)”.
У screen есть несколько отличительных особенностей, которые могут сильно помочь при выполнении задач на удаленных серверах через ssh. Я расскажу о трех, самых часто используемых мной фичах: многооконность, логирование и сессии. За более подробными деталями придется обратиться к man-странице.

Установка screen
Скорее всего, screen уже есть в вашей системе. Проверить это можно командой

Если which не дал результатов, то установите screen при помощи пакетного менеджера вашей системы. На моих серверах, в основном, CentOS и Debian, поэтому я ставлю screen так:

# yum install screen (для CentOS)
# apt-get install screen (для Debian)

Попадается и FreeBSD, в этом случае я использую порты:

# cd /usr/ports/sysutils/screen
make install clean

Использование screen
Screen запускается из командной строки также, как и любое приложение:)

Вы можете получить сообщение о том, что screen запущен, а можете и не получить… Зависит от вашей системы. Если вы не получили сообщения, то вы можете подумать, что ничего не произошло. Однако это не так. Вы уже внутри терминала, запущенного в screen. Это нормальный полнофункциональный шелл, за исключением нескольких специальных команд. Screen использует клавиатурную комбинацию Ctrl+A для подачи команд терминалам внутри себя. Попробуйте нажать Ctrl+A, а затем?
Вы увидите примерно следующее:

Screen key bindings, page 1 of 2.

Command key: ^A Literal ^A: a

break ^B b lockscreen ^X x reset Z
clear C log H screen ^C c
colon: login L select ” ‘
copy ^[ [ meta a silence _
detach ^D d monitor M split S
digraph ^V next ^@ ^N sp n suspend ^Z z
displays * number N time ^T t
fit F only Q title A
flow ^F f other ^A vbell ^G
focus ^I pow_break B version v
help ? pow_detach D width W
history { } prev ^P p ^? windows ^W w
info i readbuf < wrap ^R r
kill K redisplay ^L l writebuf >
lastmsg ^M m remove X xoff ^S s
license , removebuf = xon ^Q q

Screen воспринимает командные клавиатурные комбинации после нажатия Ctrl+A. Вы можете изменить это поведение при помощи конфиг-файла $HOME/.screenrc

Многооконность
Screen, как и большинство оконных менеджеров, поддерживает работу с несколькими окнами. Это очень удобно для выполнения параллельных задач без открытия новых ssh-сессий. Например, у меня постоянно открыто четыре или пять сессий с несколькими задачами в каждой. Раньше мне бы пришлось открыть порядка 15 терминалов, логинов, сессий.. Утомительно, не так ли? Эти неудобства полностью решает screen. Теперь я вполне могу обойтись одним терминалом.

Новое окно открывается комбинацией клавиш “Ctrl+a c”. После нажатия вы увидите новый терминал с вашим приглашением в том же окне. При этом предыдущие окна также продолжают работать. Давайте попробуем: запустите screen и в нем top

Mem: 506028K av, 500596K used, 5432K free,
0K shrd, 11752K buff
393660K cached


6538 root 25 0 1892 1892 596 R 49.1 0.3
6614 root 16 0 1544 1544 668 S 28.3 0.3
7198 admin 15 0 1108 1104 828 R 5.6 0.2

Теперь откройте новое окно, нажав “Ctrl+a c”

Вернитесь обратно, нажав Ctrl+a n

Mem: 506028K av, 500588K used, 5440K free,
0K shrd, 11960K buff
Swap: 1020116K av, 53320K used, 966796K free
392220K cached

PID USER PRI NI SIZE RSS SHARE STAT %CPU %ME
6538 root 25 0 1892 1892 596 R 48.3 0.3
6614 root 15 0 1544 1544 668 S 30.7 0.3

top остался в прежнем состоянии. Вы можете создать несколько окон и переключаться между ними используя Ctrl+a n для переключения на следующеее окно и Ctrl+a p для переключения на предыдущее. При этом каждый запущенный процесс останется в рабочем состоянии.

Отключаемся от screen
Есть два способа отключиться от screen: первый - это просто разлогиниться. Вы можете использовать клавиатурную комбинацию Ctrl+a K или просто набрать exit. Этот способ “убьет” текущее окно, если у вас их несколько или совсем остановит screen.
Второй способ заключается в отсоединении . Этот способ оставляет текущий процесс запущенным и просто отключает вас от терминала. Например, если вы через ssh-сессию запускаете какой-то очень длительный процесс, не требующий вашего внимания, то вы можете просто отключиться от screen при помощи Ctrl+a d. Это вернет вас обратно в исходную оболочку. Все процессы, запучшенные в screen, при этом остаются работающими и вы можете подключиться к ним позже.

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

# screen -ls
There are screens on:
31619.ttyp2.server (Detached)
4731.ttyp2.server (Detached)
2 Sockets in /tmp/screens/S-root.

В этом примере запущено две screen-сессии. Для подключения к нужной из них используйте команду

#screen -r 31619.ttyp2.server

Просто используйте screen с флагом r и именем сессии для повторного подключения. Это очень удобно. Можно, например, запустить какой-то длительный процесс на работе и, вернувшись домой, продолжить контроль за его выполнением.

Логирование
Мне кажется очень важным порой сохранять полный лог своих действий. К счастью, screen легко с этим справляется. Просто активируйте логирование нажатием Ctrl+a H. Screen будет продолжать логирование на протяжении всего процесса работы. Бывает очень полезно вернуться назад и посмотреть порядок необходимых действий.

И еще немного…
Screen может вести мониторинг активности окна. Если вы качаете что-то большое, компилируете программу или просто выполняете длительный процесс, вы можете долгое время наблюдать пустой терминал без признаков активности. А процесс, тем временем, продолжает выполняться. Или, наоборот, смотреть на поток отладочной информации, ожидая окончания процесса. Для начала слежения перейдите в терминал, который вы хотите наблюдать и нажмите Ctrl+a M для слежения за активностью (сработает при появлении новой информации) или Ctrl+a _ для слежения за бездействием (сработает при прекращении поступления информации в терминал). Затем вы можете спокойно переключиться в другое окно или создать новое. При наступлении события, screen предупредит вас об этом сообщением с номером окна в заголовке терминала. Для быстрого переключения в это окно используйте Ctrl+a ” (это символ кавычки). Вы увидите список всех активных окон на данный момент. Для перехода в нужное можно использовать стрелки или просто набрать номер нужного окна. Для прекращения наблюдения перейдите в нужное окно и отмените мониторинг той же командой. Например, для прекращения наблюдения за активностью нажмите Ctrl+a M

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

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

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

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

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

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

КЛАВИШНАЯ КОМБИНАЦИЯ ТЕКСТОВАЯ КОМАНДА ОПИСАНИЕ
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 оставляет видимым на экране только одно логическое окно, но при желании есть дополнительная возможность разделить экран терминала на горизонтальные регионы. Таким образом, можно отображать сразу несколько окон на одном экране терминала. Рассмотрим подробнее команды для работы с регионами экрана:

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

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

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

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

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

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

Что дальше?

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

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

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

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

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

Создатели Screen называют утилиту менеджером (псевдо)терминалов. Идея в том, чтобы вместо нескольких терминалов, открытых для одновременной работы с разными пользовательскими программами например по ssh, обеспечить доступ к этим терминалам из одного единственного терминала, как если бы мы работали в «настоящем» TTY и переключались из одного в другой клавишами Alt-Fn.

На самом деле, Screen умеет гораздо больше. Перечислю два её основных достоинства.


Рис. 2. Оба псевдотерминала в одном окне Screen (вверху) вместо двух отдельно открытых окон (внизу).

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

1. Термины и определения

Окно (window) — псевдотерминал со своим bash (nonlogin). Окна нумеруются от 0 до 9 (номера окон можно переопределить). Им можно (и желательно) присваивать имена.

Область (region) — прямоугольная область экрана, в которой отображается одно из окон. Экран можно разбить на области как вертикально, так и горизонтально.

Разметка экрана (layout). Это набор областей, на которые разбит экран терминала. Каждой разметке можно присвоить имя и внести в конфигурационный файл, чтобы иметь возможность быстро выбирать их внутри сессии Screen с помощью группы команд layout (см. ниже).

2. Описание команд

Управляющие сочетания клавиш. Для перехода в режим ввода управляющих команд в screen по умолчанию используется Ctrl-a. После нажатия этой комбинации вводится собственно управляющий символ или сочетание, например? (справка по командам) или Ctrl-I (переход в следующую область). Для упрощения изложения в дальнейшем будут упоминаться только сами управляющие сочетания без переключателя Ctrl-a.

Работа с окнами (псевдотерминалами, PTS) с Создать окно с запущенным в нём bash. K Закрыть окно А Переименовать окно r Включение / Выключение переноса строк в терминале " Вывести список окон Работа с областями экрана (regions) s Разбить область на две по горизонтали I (pipe) Разбить область на две по вертикали Tab Переключиться в следующую область экрана Q Закрыть все остальные области и оставить текущую (в которой находится фокус) Работа с сессиями Screen d Перевести сессию в фоновый режим и вернуться в системную консоль

Внутренние команды Screen. Доступны после ввода управляющего символа: (двоеточие).

mousetrack on Включить поддержку мыши для переключения между областями. При этом блокируется возможность копирования / вставки по правому щелчку мыши в окне ssh-клиента Putty. Эта функция почему-то пропадает после "открепления" сессии Screen и возвращения в неё. layout show Просмотреть список разметок экрана, заданных в конфигурационном файле layout select Выбрать заданную в конфигурационном файле именованную разметку экрана либо по номеру (n) либо по названию (title). layout save XXX Эту команду нужно выполнить для сохранения текущего layout-а с именем XXX перед откреплением сессии Screen, если в конфигурационном файле не прописано ни одной именованной разметки (например, вы только установили screen). Только в этом случае последняя разметка восстанавливается при повторном входе в сессию Screen из системной консоли. layout autosave on Команда автосохранения разметки обычно записывается в конфигурационном файле. Она запоминает тот именованный layout, который был на экране на момент "открепления" сессии Screen. Команда действует только на разметки, явно указанные в конфигурационном файле. В противном случае текущий layout нужно сохранить командой layout save XXX (см. выше). quit Закрыть все окна и завершить сессию

/* Here you can add custom CSS for the current table */ /* Lean more about CSS: https://en.wikipedia.org/wiki/Cascading_Style_Sheets */ /* To prevent the use of styles to other tables use "#supsystic-table-1" as a base selector for example: #supsystic-table-1 { ... } #supsystic-table-1 tbody { ... } #supsystic-table-1 tbody tr { ... } */

3. Пример файла конфигурации.screenrc

Глобальный файл конфигурации screen находится по адресу /etc/screenrc, но для удобства работы лучше написать пользовательский файл, который должен располагаться в домашнем каталоге пользователя ~/.screenrc. Обратите внимание, что в начале имени локального файла присутствует точка.

За основу я взял файл с Github (.screenrc by joaopizani) и подправил под свои нужды:


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

Похожие публикации