Screen не прокручивается эмулятор терминала в ubuntu. Screen — несколько экранов в одной SSH сессии. Повторное использование последнего элемента из предыдущей команды с помощью!$

Тема полезных приёмов работы в терминале Linux неисчерпаема. Казалось бы - всё устроено очень просто: приглашение оболочки, да введённые с клавиатуры команды. Однако, в этой простоте кроется бездна неочевидных, но полезных возможностей. Именно поэтому мы регулярно публикуем материалы, посвящённые особенностям работы в командной строке Linux. В частности, сегодня это будет перевод статьи, автор которой увлечён экономией времени через повышение продуктивности труда.

Если вас интересует работа в командной строке Linux - вот некоторые из наших материалов на эту тему:

  • [ +114 ] Самые полезные приёмы работы в командной строке Linux
  • [ +70 ] 10 приёмов работы в терминале Linux, о которых мало кто знает
  • [+65 ] Удивительно полезный инструмент: lsof
  • [ +32 ] Linux: перенаправление
  • [ +29 ] PDF-версия статей про Bash-скрипты

Приёмы работы в командной строке Linux и экономия времени

Вам когда-нибудь доводилось видеть, как коллега использует некие простые команды Linux для решения задач, решение которых занимает у вас несколько строк? Должно быть, когда подобное случалось, вы только и могли сказать себе: «Ну ничего ж себе! Я и не знал, что это можно сделать так просто».

В этом материале я покажу вам некоторые профессиональные приёмы работы в командной строке Linux, которые сэкономят вам уйму времени и в некоторых случаях избавят от плохого настроения. Мало того, что ваши друзья или коллеги скажут: «Ну надо же!», глядя на вас. Эти приёмы, кроме того, помогут вам увеличить личную продуктивность, так как вам понадобится вводить меньше команд и даже делать меньше щелчков мышью.

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

Прежде чем мы начнём, хочется отметить, что некоторые из приведённых здесь методов зависят от настройки командной оболочки.

0. Автозавершение команд с использованием клавиши Tab

Я начну с кое-чего вполне очевидного, но весьма важного: с автозавершения команд с помощью клавиши Tab .

Когда вы начинаете набирать что-то в терминале Linux, вы можете нажать клавишу Tab , после чего будет выведена подсказка, содержащая набор вариантов продолжения ввода, начинающихся с только что введённых символов.

Например, собираясь скопировать файл с именем my_best_file_1.txt , вы можете просто ввести cp m и нажать Tab для того, чтобы увидеть возможные варианты продолжения команды.


Использование клавиши Tab для автозавершения ввода

Клавишу Tab можно использовать и для автозавершения команд.

1. Переход в последнюю рабочую директорию

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

Cd -
Она позволит вам оказаться в последней рабочей директории. Теперь в подобных ситуациях вам не нужно больше будет вводить длинные пути, или пользоваться копированием и вставкой.


Простое переключение между директориями

2. Возврат в домашнюю директорию

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

Cd ~
Однако, в домашнюю директорию можно вернуться ещё быстрее - с помощью команды cd .

В большинстве современных дистрибутивов Linux оболочка предварительно настроена на именно такое восприятие команды cd . Это сэкономит вам пару нажатий клавиш на клавиатуре.


Самый быстрый способ перехода в домашнюю директорию

3. Вывод на экран содержимого директории

Возможно, вы зададитесь вопросом о том, в чём состоит тонкость использования команды для вывода содержимого директории. Все знают, что для этой цели служит команда ls -l .

Но в том-то всё и дело. Практически все используют команду ls -l для вывода содержимого директорий, в то время как то же самое можно сделать с помощью следующей команды:

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


Использование команды ll вместо команды ls -l

4. Вызов нескольких команд в одной строке

Представьте, что вам нужно последовательно выполнить несколько команд. Наверное, вы вводите одну команду, потом ждёте, когда она завершится, дальше - вводите следующую?

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

Command_1; command_2; command_3

5. Выполнение нескольких команд в одной строке и условие на успешное завершение предыдущей команды

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

Представьте себе, что хотите собрать код, а затем, если сборка оказалась успешной, вызвать make ?

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

Command_1 && command_2
Вот хороший пример использования && :

Sudo apt update && sudo apt upgrade

6. Простой поиск и использование ранее введённых команд

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

В подобной ситуации вас спасёт обратный поиск. Данная методика позволяет проводить поиск в истории команд по ключевому слову. Тут достаточно использовать комбинацию клавиш Ctrl + R для запуска обратного поиска и ввести что-то, имеющее отношение к команде. Система просмотрит историю команд и покажет команды, соответствующие введённому запросу.

Ctrl + R search_term
По умолчанию показан будет лишь один результат. Для того, чтобы увидеть больше результатов, соответствующих запросу, вам понадобится использовать комбинацию клавиш Ctrl + R снова и снова. Для того, чтобы выйти из режима обратного поиска, нажмите Ctrl + C .


Обратный поиск по истории команд

Обратите внимание на то, что в некоторых оболочках Bash для перебора результатов поиска можно пользоваться клавишами Page Up и Page Down .

7. Разблокировка терминала после случайного нажатия Ctrl + S

Возможно, вы привыкли пользоваться комбинацией клавиш Ctrl + S для сохранения файлов. Но если нажать эти клавиши в терминале Linux, вы его заблокируете.

Если раньше вы, для того, чтобы исправить положение, вынуждены были закрывать и снова запускать терминал - теперь может вздохнуть спокойно, больше вам этого делать не придётся. Для того, чтобы привести терминал в рабочее состояние, просто воспользуйтесь комбинацией клавиш Ctrl + Q .

8. Перемещение к началу или концу строки

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

Конечно, в подобной ситуации можно использовать клавиши Home и End , но, как вариант, с помощью комбинации клавиш Ctrl + A можно перейти в начало строки, а с помощью комбинации Ctrl + E - в конец.


Перемещение к началу или концу строки

Мне такой способ кажется удобнее, чем использование клавиш Home и End , особенно когда я работаю на ноутбуке.

9. Чтение лог-файлов в режиме реального времени

Когда вам нужно проанализировать файлы журналов, в которые, во время анализа, пишет данные какое-нибудь работающее приложение, вы можете использовать команду tail с опцией -f .

Tail -f path_to_Log
Кроме того, вы можете использовать команду grep в её обычном виде для отображения только тех строк, которые вас интересуют:

Tail -f path_to_log | grep search_term
Также тут можно задействовать опцию F . Это приведёт к тому, что утилита tail продолжит работать даже в том случае, если просматриваемый лог-файл будет удалён. При таком подходе, если этот файл снова будет создан, tail продолжит выводить данные из него на экран.

10. Чтение сжатых лог-файлов без их распаковки

Серверные журналы обычно сжаты с помощью gzip для экономии места на диске. Это может привести к некоторым неудобствам при анализе логов разработчиками или системными администраторами. Вам может понадобиться использовать команду scp для копирования файла в свою локальную директорию, а после этого извлечь файл из архива для того, чтобы его просмотреть, так как у вас может не быть разрешения на запись туда, где хранится интересующий вас файл.

Тут нам на помощью приходит группа команд, имя которых начинается с буквы «z». Эти команды являются альтернативой обычным командам, которые используются для работы с файлами журналов. Среди них - less , cat , grep , и другие.

Итак, используя команды zless , zcat , zgrep и подобные им, вам не придётся явным образом распаковывать сжатые файлы. Подробности об этих командах можно посмотреть .

Кстати, когда я рассказал об этих «секретных» командах коллеге, мне досталась чашка кофе.

11. Использование команды less для чтения файлов

Если вам нужно просмотреть файл, особенно - большой, можно попробовать команду cat , но гораздо лучше поискать что-нибудь другое. Дело в том, что cat выведет на экран весь файл, что не так уж и удобно.

Для просмотра файлов можно воспользоваться редакторами вроде Vi или Vim, работающими в терминале, но если вам просто нужно прочесть файл, очень кстати окажется команда less .

Less path_to_file
Во время сеанса работы с less можно искать нужные фрагменты текста по ключевым словам, перемещаться по страницам, выводить данные с номерами строк, и так далее.

12. Повторное использование последнего элемента из предыдущей команды с помощью!$

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

Предположим, вам нужно создать директорию, а потом в неё перейти. Тут можно воспользоваться опцией!$ , вводя команду перехода после команды создания директории.


Применение!$ для использования аргумента последней команды

Ещё лучше то же самое делается с помощью сочетания клавиш Alt +. (точка). Точку можно использовать несколько раз для перебора опций последней команды.

13. Использование предыдущей команды в текущей команде с помощью!!

С помощью!! можно вызвать всю предыдущую команду. Этот приём оказывается особенно полезным, когда вам нужно выполнить команду и оказывается, что для её выполнения нужны привилегии суперпользователя. Например, на рисунке ниже показана ситуация, в которой команда sudo !! позволяет сэкономить немало времени.


Воспользуйтесь!!! для подстановки последней команды в качестве аргумента

14. Использование псевдонимов для исправления ошибок ввода

Возможно, вы уже знакомы с командой alias . Её можно использовать для исправления ошибок во введённых командах.

Например, может случиться так, что вы часто вводите gerp вместо grep . Если с вредной привычкой справиться никак не удаётся, запишите псевдоним в свой файл bashrc следующим образом:

Alias gerp=grep
Теперь вам не придётся перенабирать эту команду если вы введёте её имя неправильно.

15. Копирование и вставка в терминале Linux

Этот совет несколько неоднозначен, так как он зависит от дистрибутива Linux и от терминала.

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

  • Выделите текст, который надо скопировать, и щёлкните правой кнопкой мыши для его вставки (работает в Putty и других SSH-клиентах для Windows).
  • Выделите текст, который надо скопировать, после чего щёлкните центральной кнопкой мыши (колесом прокрутки) для того, чтобы его вставить.
  • Используйте комбинации клавиш Ctrl + Shift + C для копирования, и Ctrl + Shift + V для вставки.

16. Завершение работы команды или процесса

Возможно, то, что я тут хочу посоветовать, совершенно очевидно, однако, всё равно об этом расскажу. Если команда выполняется на переднем плане и вы хотите из неё выйти, можете нажать клавиши Ctrl + C для того, чтобы её остановить.

17. Использование команды yes для автоматизации интерактивных команд или скриптов

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

Yes | command_or_script

18. Очистка содержимого файла без удаления самого файла

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

> filename

19. Выяснение наличия в директории файлов, содержащих определённый текст

Командная строка Linux поддерживает множество способов поиска информации. Однако, если вам просто нужно узнать, имеются ли в некоей директории файлы, которые содержат определённый текст, вы можете воспользоваться такой командой:

Grep -Pri Search_Term path_to_directory
Однако я советую всем, кому нужен поиск в Linux, разобраться как следует с командой find .

20. Вызов справки для любой команды

Хочу завершить этот материал одним весьма очевидным, но, тем не менее, очень важным «трюком», который заключается в вызове справки для команды или инструмента командной строки.

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

Command_tool --help

Я намеренно не включил в этот материал команды вроде fuck , так как они не из тех стандартных средств, которые можно найти буквально повсюду. То, о чём я тут рассказал, может принести пользу при работе практически со всеми дистрибутивами Linux и оболочками командной строки без необходимости установки новых программ.
Свободный перевод: Алексей Дмитриев
Дата перевода 19 ноября 2007

Мы говорим здесь о GNU/Linux текстовой консоли - а не о том, что появляется в окне терминала, или X-window менеджера, или рабочего стола. По этому поводу столько всякой неразберихи, что я вынужден тривиально сказать: - "Если вы, находясь в графическом режиме, нажимаете "Alt-Ctrl-F1" (или "F2"и т.д.), то вы попадаете в текстовую консоль".

0. О чем идет речь?

Происходит загрузка компьютера. Вы в текстовой консоли, наблюдаете за быстро проплывающим вниз текстом. Вы хотите просмотреть уже промелькнувший кусок этого текста. Вы нажимаете "Shift-PgUp" или "Shift-PgDn", а если раньше уже изменяли сочетания клавиш по умолчанию (нет-нет, не раскладку клавиатуры в Иксах), то какие-либо другие клавиши. Этими клавишами вы заставляете текст перемещаться вверх-вниз по экрану. В данный момент вы используете буфер обратной прокрутки (назовем его буфер прокрутки для краткости).

Когда начинаешь вовсю пользоваться этим буфером, то очень скоро выясняются две вещи:
Только часть текста, сопровождавшего загрузку, может быть возвращена.
Файл "/var/log/messages" фиксирует гораздо меньше того, что вы хотели увидеть.

Вы начинаете прочесывать Интернет, и вскоре предварительные результаты появляются: публикации по обратной прокрутке в Линуксе весьма древние и прослеживаются до ранних 90х годов. Однако обо всем, что было до ядра версии 2.6.x следует забыть.

В самом деле, следует быть избирательным в том, что читаешь: большинство советов, относящихся к версиям прежде 2.6.x, скорее всего запутают вас и уведут по ложному пути. Поверьте мне - я убил на это дело много времени. Поведение обратной прокрутки определяется в файле "vc.c", противном маленьком файлике в исходниках ядра, причем "vc" обозначает "virtual console" (виртуальная консоль).

Заметьте, что при переключении консолей, буфер прокрутки теряется - таким образом, в текущей консоли доступен полный объем этого буфера. (Здесь особенно много завалов информационного мусора со времен до ядра 2.6.x).

По умолчанию, размер буфера равен 32K. Этого хватает на 4 нажатия клавиш обратной прокрутки - каждое нажатие прокручивает половину экрана, 25 строчек на экран. Выходит около 50 строк. И больше вы не получите, даже еcли у вас 30 или 50 строк на экран. Нужно сказать, что 50 строк - это малая толика того, что пролетает по экрану за время загрузки. В связи с вышеизложенным, встают два вопроса:

Как увеличить буфер прокрутки?

Почему логи не фиксируют некоторые сообщения, которые вы видели во время загрузки?

1. Как увеличить буфер обратной прокрутки?

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

И такое средство есть, а называется оно "framebuffer console", для краткости "fbcon". Это устройство имеет файл документации "fbcon.txt"; если вы устанавливали документацию к ядру, то он у вас есть. Выискивайте его где-то в районе "/usr/share" ветви (я не могу указать точный путь из-за разницы в дистрибутивах). Всегда можно скачать его как одиночный файл .

На этом месте прошу прощения: мы должны сделать небольшое отступление и немного поговорить о видеобуфере (framebuffer).

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

Один из таких трюков связан с буфером прокрутки; оказывается, вы можете "попросить" видеобуфер выделить больше памяти буферу прокрутки. Достигается это через загрузочные параметры ядра. Сначала вы требуете framebuffer (видеобуфер); Затем запрашиваете больший буфер прокрутки.

Нижеследующий пример касается GRUB, но может быть легко адаптирован к LILO. В файле настройки GRUB - "menu.lst"- найдите соответствующую ядру строчку, и затем:
Удалите опцию "vga=xxx", если таковая присутствует.
Добавьте опцию "video=vesabf" или то, что соответствует вашему "железу".
Добавьте опцию "fbcon=scrollback:128".
После этой процедуры, строка параметров ядра должна выглядеть приблизительно так:
"kernel /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128".

Спрашивается, зачем удалять опцию "vga=xxx"? Из-за возможных конфликтов с видео-опцией. На своем ATI адаптере, я не могу изменить буфер прокрутки, если "vga=xxx" присутствует в списке. Возможно в вашем случае это не так. Если вышеперечисленные опции работают - хорошо; но что, если вы хотите увеличить число строк, или установить более мелкий шрифт на экране? Вы всегда делали это при помощи опции "vga=xxx" - а она-то и исчезла. Не переживайте - то же самое может быть достигнуто изменением параметров fbcon, как описано в файле "fbcon.txt" (но не описано в данной статье). В Ubuntu и Debian есть более удобный способ: "dpkg-reconfigure console-setup". Эту команду стоит использовать также и потому, что она еще и корректирует "initrd" на ваши новые настройки.

2. Расширение пределов

Опция "fbcon=scrollback:128" дает вам возможность перемещения по буферу прокрутки на 12-13 экранов. Это приблизительно 150 строк - вполне неплохо, Но, возможно, еще недостаточно для просмотра всех загрузочных сообщений. Можно ли поставить больше 128, скажем, 256? Предел 128 заложен в "vc.c". Если хотите больше, редактируйте и компилируйте. Для себя я решил, что игра не стоит свеч.

Когда я уже совсем решил, что достиг наивысшего предела - я цитирую из "fbcon.txt":
fbcon=scrollback:[k]
...
The "k" suffix is optional, and will multiply the "value" by 1024.
(Суффикс "k" является опциональным, и умножит значение "value" в 1024 раза).
Я бросился проверять,.. и, что бы ни думал по этому поводу автор, убедился, что 128 и 128k дают абсолютно одинаковый результат. Предел по умолчанию равен 128KB памяти, вот и весь сказ.

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

3. Что отсутствует в логах?

В Ubuntu и Debian и других дистрибутивах все системные сообщения сохраняются в файле "/var/log/messages". Это применимо, даже если сервис (daemon) протоколирования не старый "syslog", а "syslog-ng" ("ng": "new generation" /новое поколение/).

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

Это свойство, а не ошибка! Сообщения, протоколируемые в файле, приходят от различных субсистем ОС. Субсистемы, выдающие сообщения в файл протокола, в терминологии syslog обозначаются как "facilities" ("средства" или "услуги"), их всего 8 штук. В процессе загрузки работают программы и скрипты, которые могут и не принадлежать ни к одному из 8 "средств". Мы видим их сообщения, пробегающими по экрану, но ничего не будет зафиксировано в лог-файле!

Например вы не увидите сообщений от программ "loadkeys" (openSUSE) или "consolechars" (Ubuntu и Debian), когда происходит загрузка раскладки клавиатуры во время загрузки системы. Другой пример: когда пользуетесь консольным текстовым редактором, вы можете прокручивать дисплей назад (включая цвета), пользуясь при этом буфером прокрутки. Но то, что производит редактор, никогда не попадет ни в один системный протокол. Причина, разумеется, в том, что ни "loadkeys", ни "consolechars", ни редактор, не принадлежат ни к одному из 8 "средств".

Можно ли изменить ситуацию? Конечно - "просто" переделайте и перекомпилируйте те приложения, которые вы хотите протоколировать. Допишите или перепишите загрузочные скрипты. Или заставьте систему фиксировать сообщения извне 8 системных "средств".

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

Если вам понравилась статья, поделитесь ею с друзьями:

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/) — попытка создать текстовый оконный интерфейс аналогичный графическим собратьям.