Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Работа в консоли Linux

GNU Screen: введение для чайников

Оригинал: A dummies introduction to GNU Screen
Автор: Kumar Appaiah
Дата: февраль 2008
Свободный перевод: Алексей Дмитриев
Дата перевода: 14 марта 2008

По мере того, как графический интерфейс становится все более дружественным и простым в использовании, новые пользователи GNU/Linux и BSD могут делать свою повседневную работу, не прибегая к возне с терминалом. Однако довольно большое число пользователей не любят использовать графический интерфейс (GUI) для всего на свете, и считают, что им необходимо частично опираться на терминал, или шелл. Кому-то нужно наладить доступ к удаленной машине, не имея GUI, другому понадобилось использовать "консольное" приложение. В таких ситуациях есть несколько путей эффективно использовать такую утилиту как screen.

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

1. Я люблю xterm, и использую его во всех случаях, когда требуется работа в терминале. Но мне не нравится, что он не имеет множественных вкладок. Да, я знаю, что некоторые консоли: GNOME терминал, mrxvt и другие поддерживают вкладки, но они не могут, подобно команде screen, сочетаниями клавиш открывать новые приложения в новых вкладках. Я покажу вам, как это делается.
2. У меня дома стоит компьютер А, другой компьютер, назовем его В, стоит в моей лаборатории. На лабораторной машине (В) я должен запустить программу Х, которая требует много времени на свое выполнение. По SSH (Secure Shell - сетевой протокол, позволяющий производить удалённое управление операционной системой и передачу файлов), я утром запускаю программу на машине В со своей домашней машины А. Теперь я должен иметь возможность закрыть сеанс SSH так, чтобы программа продолжала работать в прежнем режиме. Теперь, если я поеду в лабораторию, где залогинюсь в машину В, я должен иметь возможность "подключиться" к оболочке, обрабатывающей ту самую программу Х, которую она начала обрабатывать с утра. Но это еще не все. Я должен иметь возможность доступа к обработке той же программы Х, подключаясь к машине В по SSH откуда-нибудь еще. Ну как, не слабо!? Но ведь в этом есть смысл, верно?

Итак, я собираюсь показать, как команда screen приходит на выручку в обеих описанных ситуациях. Это будет скорее объяснение, как достичь цели, чем детализация того, зачем я это проделал, или какие еще способы существуют в программе screen для достижения этой цели. Я просто упомяну в конце некоторые приемы и укажу на руководства. Моя цель дать вам представление, какая это мощная и гибкая, и в то же время простая программа.

Начинаем программу screen

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

Если вы это проделали, то, скорее всего не заметите ничего особенного. Разве что новый шелл открылся вместо старого. Но вы можете убедиться в том, что работает программа screen, причем несколькими способами. Первый способ - простой (но без "защиты от дурака") - это проверить переменную окружения TERM.

echo $TERM

Скорее всего, на выходе будет `screen', вместо xterm, vt100, linux и так далее, что подтверждает, что вы находитесь в screen. Дальше. Когда я принимаюсь за изучение новой команды, первое, что я люблю сделать, это найти способ безопасно выйти из нее, для того, чтобы при случае спастись от беды. Итак, давайте покинем шелл нормальным способом (напечатав в командной строке exit, либо нажав Ctrl+D, для большинства шеллов). Мы убедимся что screen закончил работу (screen terminates). Это и был второй способ убедиться, что screen работал. Теперь, когда команда готова к работе, давайте применим ее.

Клавиша-приставка (prefix key)

Для всех команд и сочетаний клавиш в программе screen вы должны ввести клавишу-приставку. По умолчанию это сочетание Ctrl+a (C-a). Итак, чтобы, к примеру, создать новое окно, вы должны сначала нажать C-a, а затем C-c. Замечу, что для людей вроде меня, привыкших к поведению нескольких программ, вроде readline, emacs и прочих, в которых сочетание C-a используется для начала новой строки, использование этого сокращения в качестве клавиши-приставки является чрезвычайно неудачным выбором. Можно, пересиливая себя, продолжать пользоваться C-a для достижения нужной цели в screen, хотя это болезненно, а можно назначить другое сочетание клавиш в качестве клавиши-приставки. Как это сделать, я расскажу в конце.

Тем не менее, в данной статье, я придерживаюсь того, что сочетание C-a является клавишей-приставкой. (Хотя вам ничто не мешает изменить ее, заглянув в конец статьи). Все остальное остается без изменений.

Как создавать и использовать новые окна

Когда вы запустили screen, очень легко манипулировать и переключать окна. Чтобы создать окно нужно нажать C-a c, и вы в новом окне. По правде говоря, между окнами нет никакой разницы, но вот простой способ различать их - введите в окно какой-либо текст (например, команду ls /usr/bin). Затем создайте новое окно при помощи C-a c. Потом переключайтесь между окнами при помощи комбинации C-a n и убедитесь, что действительно переключаетесь между двумя различными окнами.

Теперь создайте несколько окон, и в каждом проделайте какую-нибудь операцию. Теперь вы окончательно заблудились в этих окнах, не правда ли? Как получить список открытых окон? Просто - достаточно набрать C-a ", появится список окон, в котором можно переключатся, при помощи стрелочек и клавиши Еnter. (Примечание переводчика: Автор чрезвычайно милый человек и хочет, чтобы все было чрезвычайно просто. Я же не очень милый человек и склонен все проверять. Так вот, в виртуальном терминале (куда попадают через Ctrl+Alt+Fn), указанную автором комбинацию C-a " следует выполнять так: Ctrl(удерживать) - а (нажать и отпустить вместе с Ctrl), затем нажать " (т.е. Shift+"). Не забудьте про раскладку клавиатуры! Так что постигать следует не торопясь.)

Ясное дело, что большинство окон неразличимы, как близнецы, так как они озаглавлены названием оболочки (в моем случае, bash), так что лучше дать им имена для легкости ориентирования. Чтобы наименовать окно, нужно ввести C-a A, и затем изменить имя на какое угодно. Если вы запутались, сочетание C-a " выведет список окон. Это подвигнет вас на создание множественных окон внутри одного терминала. Мой пример файла screenrc, который я приведу ниже, показывает способ имитировать дисплей со многими вкладками, который показывает имена и номера окон, что может быть весьма полезно.

Если вы хотите "закрыть" окно, лучше всего дать команду exit оболочке, работающей в этом окне, предварительно остановив работающее там приложение. Если приложение "подвисло" и его не удается закрыть, можно "убить" все окно со всеми его приложениями при помощи комбинации C-a k, но старайтесь избегать такого финала. Закрытие всех активных окон закрывает программу screen, о чем появляется извещение.

Все вышеизложенное дает вам общее представление о некоторых возможностях screen. Часто люди запускают различные приложения в различных окнах screen, и маркируют окна для простоты доступа. Например, я часто запускаю Mutt (почтовый клиент) и irssi (IRC клиент) в программе screen, и оставляю их работать, чтобы в любой момент были под рукой.

Но вот мы закончили с частью, посвященной множественным окнам, давайте перейдем к части, посвященной отключениям и повторным подключениям, и увидим, как получить доступ к работающему приложению, даже после закрытия терминала, либо с удаленной машины (используя ssh).

Переключение окон

В программе screen существует несколько способов "путешествовать" по окнам. Вот несколько из них:

1. Как описано выше, C-a " выводит меню, в котором вы можете выбрать нужное окно. 2. C-a n и C-a p помогут перейти в следующее -n (next), либо в предыдущее -p (previous) окно соответственно. Это удобно для "шагания" по последовательным окнам. 3. C-a <number> - еще один способ попасть в нужное окно.

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

Постоянство рабочей области: отключение и повторное подключение

Итак, мы в середине процесса постижения этой удивительной программы, которая изменит способ использования компьютеров по всему миру. (А, вы как раз играете в одну из этих консольных игр, и, кажется, как никогда близки к победе!?) И тут вы понимаете, что настала пора работать, и вам придется выйти из игры! Не надо паники, кое-что можно сделать, чтобы сохранить все приложения работающими в окнах программы screen, как они и работали; так что вы либо сможете вернуться позже, чтобы закончить работу (или игру), либо подсоединиться к вашему компьютеру с удаленного места (через ssh, например) и возобновить свою деятельность. Звучит неплохо, а?

Добиться этого можно, отключая и повторно подключая программу screen. Чтобы оставить все программы работающими в своих окнах, можно действовать двояко, в зависимости от ситуации. Простейший способ, если вы запускали screen под Иксами в эмуляторе терминала (XTerm, gnome-terminal, konsole etc.), это просто закрыть эмулятор терминала, используя кнопку Закрыть, либо Файл --> Выход, либо другим стандартным путем. В этом случае программа screen получает сигнал, посланный ей эмулятором терминала, и продолжает работать, позволяя эмулятору терминала закрыться. Второй (и более очевидный) способ отключиться от программы screen, заключается в применении комбинации C-a d, что вернет вас в тот шелл, из которого вы запускали screen, с уведомлением "[detached]" (отключено). Это, видимо, единственный элегантный способ отключиться от tty терминала. Для повторного подключения к работающей программе screen нужно запустить эмулятор терминала (или прейти в tty терминал) и набрать команду screen -r, и вы вернетесь в то же состояние, что до отключения. В случае, если у вас отключено несколько "экземпляров" программы screen, то вы получите список доступных для подключения экземпляров программ, и вам придется добавить номер ID процесса того экземпляра программы, к которому вы хотите подключиться. Также, если вы забыли отключиться от программы screen, а теперь хотите переподключиться с удаленного места, то вам придется сперва отключиться, а затем переподключиться при помощи команды screen -dr.

Чтобы убедиться, что приложение в окне screen действительно продолжает работать после отключения, можете провести несложный тест: Запустите screen и начните в нем какую-нибудь программу, скажем текстовой браузер (типа elinks), или команду top; или же начните действительно большую закачку при помощи wget. Теперь отключитесь методом, описанным выше, и запустите программу ps ax|grep <имя_приложения>, чтобы убедиться, что приложение продолжает работать. Например, я запускал elinks из-под screen, отключался, и команда ps ax|grep [e]links уверенно давала вывод, содержащий elinks.

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

Другие команды и свойства

Программа screen имеет и другие свойства, о которых я не упоминаю здесь, так как сам их еще не испробовал. Чтобы получить полное представление о возможностях программы screen, читайте man screen. Для помощи во время использования программы, вы можете получить список команд и комбинаций при помощи сочетания клавиш C-a ?.

Пример файла настройки screenrc

Прежде чем закончить эту статью, мне бы хотелось дать вам краткую инструкцию, как настраивать screen при помощи файла $HOME/.screenrc, чтобы вы могли сохранять настройки для следующих запусков программы. Читайте ман для более полной информации по синтаксису и смыслу этих команд. Вот как выглядит этот файл:

# Прежде всего, мне не нравится C-a в качестве 
# ключевой комбинации, так как  я часто использую ее 
# в качестве клавиши `Home' в других программах, 
# поэтому я выбрал комбинацию C-\ в качестве 
# клавиши-приставки, 
# добавив эту строчку в свой файл ~/.screenrc.

escape \034\034

# (Если вам интересно, то \034 это есть сочетание C-\ # в восьмеричной форме). Читайте документацию по `escape' # в мане screen, чтобы узнать как я до этого додумался).

# Предпочитаю звуковой сигнал визуальному.

vbell off

# Пропустить сообщение при старте.

startup_message off

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

caption always caption string "%{kw}%-w%{wr}%n %t%{-}%+w"

# Специальная комбинация C-a m будет запускать Mutt в окне 7 # (если оно доступно), или в следующем доступном окне.

bind m screen -t 'Mutt' 7 mutt

# Аналогично с Elinks и Irssi.

bind e screen -t 'Elinks' 8 elinks www.google.co.in bind i screen -t 'Irssi' 9 irssi

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

Заключение

Эта статья - моя попытка дать вам представление о часто используемых возможностях программы screen. Я уверен, что они помогут всем фанатам терминала, любящим часто переключаться между приложениями. Стоит вам начать, и вы найдете он-лайн множество документов и трюков, чтобы продолжить изучение свойств программы screen. Я порекомендую внимательно прочитать man-страницу screen, чтобы узнать обо всех возможностях этой удивительной программы. Особое внимание обратите на разделы по мониторингу активности окон и по расщеплению (разделению на части) окон screen.


Примечание редактора: В дополнение к этому материалу вы можете посмотреть еще две небольших заметки о программе screen:

  • Андрей Синицын, "Учимся использовать screen"

  • Андрей Синицын, "Еще немного о screen"