Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программы > Screen

Screen

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

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

# cd /usr/ports/sysutils/screen
# less pkg-descr

Screen is a full-screen window manager that multiplexes a physical terminal
between several processes (typically interactive shells).
Each virtual terminal provides the functions of a DEC VT100 terminal and, in
addition, several control functions from the ANSI X3.64 (ISO 6429) and ISO
2022 standards (e.g. insert/delete line and support for multiple character
sets). There is a scrollback history buffer for each virtual terminal and a
copy-and-paste mechanism that allows moving text regions between windows.

WWW: http://www.gnu.org/software/screen/

#make
#make install
#make clean
#rehash

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

Код:
Ctrl-a c
Ctrl-a Сtrl-c	Создать новое окно screen'а.
Ctrl-a [0..9,-]	Переключиться между окнами, или получить пустое окно.
Ctrl-a "	Список окон.
Ctrl-a Ctrl-a	Переключение между двумя окнами - между активным и предыдущим.
Ctrl-a n|p	next|prev
Ctrl-a C	Очистить экран.
Ctrl-a A	Позволяет ввести заголовок окна.
Ctrl-a d	Отключиться от сеанса screen. (Присоединиться можно командой screen -r)
Ctrl-a k	Закрыть текущее окно с подтверждением.
Ctrl-a ?	Задать вопрос (очень полезно), если не знал, а еще и забыл.

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

Код:
-ls
-list		Не запуская screen выдает список отсоединенных screen'ов.
-r [pid.tty.host] Подключиться к screen или же к определенной сессии.
-x		Присоединиться к неотсоединенному screen - позволяет одновременно
		работать с разных мест разным людям. Удобно для удаленного
		обучения (хотя в FreeBSD есть watch).
-R		Пытается присоединиться к первому найденному отсоединенному
		screen. Если не находит - создает новый screen.

screenrc

При запуске screen выполняет команды из "/usr/local/etc/screenrc" и "~/.screenrc". Все это можно переопределить системными переменными, но, лично я, не вижу особого смысла. Тем более, что у меня только сервер и пользователей раз-два обчелся. При запуске с ключом , можно указать другой файл screenrc.

Команды указываются по одной в строке, пустые строки игнорируются.  Разделители между аргументами и ключами -  символы табуляции или пробелы. Символ '#' и следующий за ним текст - комментарии (исключение - помещение его в кавычки).

Команды могут содержать ссылки на переменные окружения. Синтаксис подобен shell - "$VAR " или "${VAR}".

Пример файла конфигурации находится в /usr/local/share/examples/screen/screenrc. (вот тут какая-то ошибка в мануале, насчет файлов примеров - такую мелочь можно простить).

Команды можно ввести в процессе работы программы, путем нажатия 'Ctrl-a :'.

В файле screenrc и в "командном" режиме доступны следующие команды:

  • acl-команды, определяющие доступ к сессии, привилегии - как для пользователей, так и для групп;
  • bind-команды - привязка  клавиш;
  • команды оформления;
  • другие команды.

Читайте мануал - команд много - все таки первоисточник.

Приведу мой конфиг:

###
# Screenrc configuration file
###

# Приветственное сообщение off|on
startup_message off

# визуальный биппер. off|onn
vbell on
# то, что он бипер пишет в строке статуса
vbell_msg "   Uh! - Uh! - bzzz "

# "Красивые" подписи
nethack on

# Количество строк истории хранить в буфере
defscrollback 2000
#

# Строка состояния в screen (hardstatus)

hardstatus alwayslastline "%{=b}%{g}Window: %{b}%w %=%{kG}%с %D %Y-%m-%d"

# Расшифровка:
# здесь (я беру параметры в одинарные кавычки):
# '%{=b}' - черный цвет фона строки. 
# '%{g} Window: ' - слово 'Window: ' зеленоe
# '%{b}%w' - список запущенных окон (звездочкой будет указан активное окно)
# '%=' - все, что идет после этого выравнивается по правому краю
# '%{kG}%с' - показывает время, я люблю формат 24-часа, без pm|am (%C%A - 12часовой с PM|AM)
# '%D, %Y-%m-%d' - показывает дату

# --- Привязки специальных клавиш ---

# отделить сессию от текущего терминала
bindkey -k k7 detach

# уничтожить текущую сессию F8
bindkey -k k8 kill

# создать новое окно F9
bindkey -k k9 screen

# вернуться к предыдущему окну F11
bindkey -k F1 prev

# перейти к следущему окну F12
bindkey -k F2 next

# Удаляем некоторые ненужные или небезопасные комбинации
bind .
bind ^\
bind \\
bind ^h
bind h

На этом - все.


Что почитать?


Материал взят: http://club.shelek.ru/print.php?id=308

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

Итак, начинаем работу. Запустить новый screen можно, как ни странно, просто командой screen без параметров:

# screen 

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

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

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

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

  1. если сессия одна, достаточно просто команды: screen -x
  2. если сессий несколько, то: посмотреть список запущенных screen'ов можно командой screen -ls:
  3. # 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'а не исчерпываются. Иногда, при работе по 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 с помощью файла ~/.screenrc, в вашем домашнем каталоге. Например, можно написать туда вот такую абракадабру:

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

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

Вот примерно так маленький и незаметный screen может существенно облегчить жизнь.

Материал взят: http://www.in4.org.ua/

Автоматический запуск приложений при старте Screen

# cat startup.scr
screen -t rtorrent 0 rtorrent
screen -t microdc 1 microdc
screen -t mc 2 mc
screen -t top 3 top -P
# screen -d -m -S autostart -c startup.scr

То есть создать конфиг, отличный от .screenrc, записав в него всё что хочеш, в том числе расставленный по "закладкам" программы, и запускать screen с указанием читать альтернативный этот конфиг.


Screen - оставляем процессы в фоне и идем спать (пример файла .screenrc)

Вспомнилась одна очень удобная и полезная программка для FreeBSD - screen называется. Screen - это полноценный консольный оконный менеджер, объединяющий физический терминал c (возможно) несколькими интерактивными, виртуальными шеллами, которые могут открепляться от физического терминала и продолжать "жить своей жизнью". Каждый виртуальный терминал предоставляет использование возможностей терминала DEC VT100 по стандартам ISO2022 (такие как вставка/удаление строки и поддержка различных кодировок). Также поддерживается сколлинг буфера для просмотра истории команд и механизм "копировать-вставить", что позволяет перемещать фрагменты текста между отдельными окнами.

Screen'ы удобны тем, что в них можно оставить любые запущенные процессы и уйти, закрыв физический терминал (если Вы ходите на сервер с помощью putty, например), а позднее, войдя в систему вновь, можно подключиться к висящему в фоне скрину и продолжить в нем работу. Скрины не раз выручали меня когда приходилось запускать на сервере процессы компиляции чего-либо надолго. Компьютер (рабочая станция) не может работать круглые сутки. К тому же, запуская что-то из дому, требуется потом проверить с работы как обстоят дела. Последний раз я вспомнил о screen, когда после обновления FreeBSD до 7.0 запускал обновление пакетов (-all). Процесс длился почти пару десятков часов, а сидеть возле монитора постоянно я, понятное дело, не мог: Да что там говорить. Это просто надо попробовать. В screen'е даже ту же самую аську можно запустить в фоне и свалить с машины. Рекомендую: Screen == Must Have!

Установить утилиту screen можно из портов FreeBSD. Компиляция + установка проста и занимает всего 30 секунд (сама программка довольно маленькая; пакет с исходниками весит всего 820 килобайт).

# cd /usr/ports/
make search name="screen"

...
Port: screen-4.0.3
Path: /usr/ports/sysutils/screen
Info: A multi-screen window manager
Maint: cy@FreeBSD.org
B-deps:
R-deps:
WWW: http://www.gnu.org/software/screen/
...
# cd /usr/ports/sysutils/screen
# make install clean

Осталось теперь совсем немного. Подогнать под себя файл настроек и: привыкнуть к необычным "быстрым клавишам". Их много, но на практике я использую совсем чуть-чуть.

Стандартный файл с настройками появится после установки в каталоге /usr/local/etc/. Называется он screenrc и его, для внесения изменений, лучше скопировать в домашний каталог пользователя.

# cp /usr/local/etc/screenrc ~/.screenrc<br>
Теперь отредактируем его. Вот мой вариант этого файла.
#################################################################
# Screen[rc] configuration file by Daemony
###
# --- Основное ---

# Отключаем приветственное сообщение
startup_message off

# Можно включить (или выключить - off)
# визуальный биппер.
vbell on
# И то, что он будет писать в строке статуса
vbell_msg " Din! - Don! "

# "Красивые" подписи
nethack on

# Сколько строчек истории хранить в буфере
defscrollback 2000
#
# Таймаут сообщений в секундах
msgwait 1

# --- Настройки строки состояния ---
#
# Строка состояния в screen или же по другому hardstatus
# определяется несколькими параметрами, идущими в <u><strong>одну</strong></u> строку.
#
hardstatus alwayslastline "%{=b}%{g} Term: %{b}%w %=%{kG}%C%A %D %Y-%m-%d"

# здесь (я беру параметры в одинарные кавычки):
# '%{=b}' - путем эксперимента удалось выяснить, что оно делает
# черным цвет фона строки. %)
# '%{g} Term: ' - задает вывести слово ' Term: ' зелеными
# буквами (пробелы тоже считаются - ими можно делать отступы)
# '%{b}%w' - выводит список запущенных оболочек голубым цветом
# '%=' - все, что идет после этого выравнивается по правому краю
# '%{kG}%C%A' - показывает время в двенадцатичасовом формате.
# '%D, %Y-%m-%d' - показывает дату: 'чт 2008-03-06?

# - Привязки специальных клавиш -

# - отделить сессию от текущего терминала
bindkey -k k7 detach

# - уничтожить текущую сессию
bindkey -k k8 kill

# - создать новое окно
bindkey -k k9 screen

# - переименовать текущее окно
bindkey -k k; title

# bind F11 вернуться к предыдущему окну
bindkey -k F1 prev

# bind F12 перейти к следущему окну.
bindkey -k F2 next

# - Настройки для различных терминалов -
# Взяты из дефолтового конфига /usr/local/etc/screenrc За пояснениями - в ман.

termcap facit|vt100|xterm LP:G0
terminfo facit|vt100|xterm LP:G0
termcap facit al=\E[L\E[K:AL@:dl@:DL@:cs=\E[%i%d;%dr:ic@
terminfo facit al=\E[L\E[K:AL@:dl@:DL@:cs=\E[%i%p1%d;%p2%dr:ic@
termcap sun 'up=^K:AL=\E[%dL:DL=\E[%dM:UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=
разрыв строки
\E[%dC:IC=\E[%d@:WS=1000\E[8;%d;%dt'
terminfo sun 'up=^K:AL=\E[%p1%dL:DL=\E[%p1%dM:UP=\E[%p1%dA:DO=\E[%p1%dB:LE
разрыв строки
=\E[%p1%dD:RI=\E[%p1%dC:IC=\E[%p1%d@:WS=\E[8;%p1%d;%p2%dt$<1000>'
termcap xterm|fptwist hs@:cs=\E[%i%d;%dr:im=\E[4h:ei=\E[4l
terminfo xterm|fptwist hs@:cs=\E[%i%p1%d;%p2%dr:im=\E[4h:ei=\E[4l
termcap vt100 dl=5\E[M
terminfo vt100 dl=5\E[M
termcap xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
terminfo xterm 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l'
termcap hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p
разрыв строки
:ds=\E[62"p\E[1$~\E[61"p:ic@'
terminfo hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:
разрыв строки
ds=\E[62"p\E[1$~\E[61"p:ic@'
termcap wy75-42 nx:xo:Z0=\E[?3h\E[31h:Z1=\E[?3l\E[31h
terminfo wy75-42 nx:xo:Z0=\E[?3h\E[31h:Z1=\E[?3l\E[31h

# Удаляем некоторые ненужные или небезопасные комбинации
bind k
bind ^k
bind .
bind ^\
bind \\
bind ^h
bind h

# И еще пару строк, взятых с какого-то буржуйского сайта:
# - следущий показывает текущую активность
activity 'Activity on screen %n ^G'

# - а этим можно заменить строку hardstatus

caption always "%{+b bk}%H%{gk} | %c %{ck}%d.%m.%Y | %{gk} %?%-Lw%?%{gw}%n*%f %t%?(%u)
разрыв строки
%?%{gk}%?%+Lw%? | %{ck} Load: %l %{wk}"
#################################################################

Сохраняем этот файл и запускаем screen.

# screen

Запустится терминал номер ноль. Теперь в Вашем распоряжении два режима. Сразу после входа в скрины будет доступен режим оболочки, в котором можно работать с консолью как и обычно. Для того, чтобы послать программе screen какую-либо команду следует нажать Crtl-A и сказать, например: Crtl-C - для создания новой оболочки; Ctrl и цифру с номером консоли (если запущено несколько виртуальных консолей) для перехода на эту консоль; Crtl-D - для того, чтобы открепиться от скрина и вернуться в физический терминал и так далее. Назначив в конфиге "быстрые клавиши", можно использовать и их. Это наиболее распространенные комбинации (что пришли в голову), а вот еще (те что в мане накопал):

  • Crtl и " - показать список активных окон и перейти к нужному;
  • Crtl-A дважды - перейти к предыдудщему окну;
  • Crtl-A a - послать окну эскейп последовательность Crtl-A;
  • Crtl-A A - переименовать текущее окно, задать свое название;
  • Crtl-A Crtl-B - послать в окно Break;
  • Crtl-A C - очистить текущее окно;
  • Crtl-A h - создать копию (что-то вроде ПринтСкрин) текущего окна в файл hardcopy.n, где n - номер текущего окна;
  • Crtl-A Crtl-I - показать информацию о текущем окне;
  • Crtl-A Crtl-K - уничтожить текущее окно;
  • Crtl-A Crtl-M - показать последнее сообщение в строке статуса;
  • Crtl-A Crtl-N - переключиться на следущее окно;
  • Crtl-A backspace или Crtl-A Crtl-P или Crtl-A p или Crtl-A h - переключиться на предыдущее окно;
  • Crtl-A S - разделить текущее окно на две части;
  • Crtl-A Crtl-X - блокировка текущего экрана под пароль пользователя, что ее запустил;
  • И самая полезная, на мой взгляд, комбинация - Crtl-A ? - она выведет справку по всем комбинациям клавиш.

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

# screen -rd

Если запущено несколько скринов, то Вы увидите предупреждение:

# screen -rd
There are several suitable screens on:
 43929.ttyp6.hostname (Detached)
 47381.ttyp5.hostname (Detached)
 48024.ttyp5.hostname (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

В этом случае следует указать идентификатор скрина - он кстати совпадает с id запущенного процесса screen в системе.

# screen -rd 43929<br>

Естественно, обычные пользователи, не могут войти в чужой скрин. Ну, а root может все.

Screen'ы могут висеть в системе годами. До первой перезагрузки сервера. Если произошла перезагрузка и в этот момент висели активные скрины, то после ребута их, само собой, не останется. Но останутся их "трупы", о чем Вам сообщит программа:

# screen -rd
There are screens on:
 48273.ttyp5.hostname (Dead ???)
 47381.ttyp5.hostname (Dead ???)
 48024.ttyp5.hostname (Dead ???)
Remove dead screens with 'screen -wipe'.
There is no screen to be detached.

Мол, простите, но нет открепленных скринов. Хотя есть убиенные с такими-то идентификаторами. Лежат они себе на "кладбище" в /tmp/screens/S-USERNAME и почистить их можно так:

# screen -wipe 48273 47381 48024
There is a screen on:
 48273.ttyp5.hostname (Removed)
 47381.ttyp5.hostname (Removed)
 48024.ttyp5.hostname (Removed)
3 socket wiped out.
No Sockets found in /tmp/screens/S-daemony.

Программа Screen. Запуск приложений в фоновом режиме

Главная > Программы > Screen